I looked at Undefined reference to vtable, but even after adding a destructor I am still met with a similar error:
main.cpp:(.text._ZN8isStringC2Ev[_ZN8isStringC5Ev]+0xf): undefined reference to `vtable for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o: in function `isString::~isString()':
main.cpp:(.text._ZN8isStringD2Ev[_ZN8isStringD5Ev]+0xf): undefined reference to `vtable for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o:(.data.rel.ro._ZTI8MyString[_ZTI8MyString]+0x10): undefined reference to `typeinfo for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o:(.data.rel.ro._ZTI14CStringAdapter[_ZTI14CStringAdapter]+0x10): undefined reference to `typeinfo for isString'
collect2: error: ld returned 1 exit status
The following code is creating my own String class, but using an adapter for cstrings. They (MyString and CStringAdapter classes) inherit from a pure virtual class isString. I'm just trying to understand how to use adapters; I know creating my own string class is quite pointless. I'm using C++ 17.
#include <iostream>
#include <cstring>
using namespace std;
class isString{
public:
    virtual ~isString()=default;
    virtual const char* getBuffer()const;
    virtual size_t size()const;
};
class CStringAdapter: public isString{
protected:
    string str;
public:
    CStringAdapter(): str{""} {}
    CStringAdapter(const char* newStr): str{newStr} {}
    ~CStringAdapter()=default;
    
    const char* getBuffer() const override { return str.c_str(); }
    size_t size() const override { return str.size(); }
};
class MyString: public isString{
protected:
    string str;
public:
    MyString():str{""} {}
    MyString(const char* newCStr) { *this = newCStr; }
    MyString(const MyString& newStr) { *this = newStr; }
    ~MyString()=default;
    
    MyString& Assign(const isString& myStr, const isString& aStr){
        memcpy(const_cast<char*>(myStr.getBuffer()), aStr.getBuffer(), aStr.size());
        return *this;
    }
    MyString& operator=(const MyString& aString){ return Assign(*this, aString); }
    MyString& operator=(const char* aCString){ return Assign(*this, CStringAdapter(aCString)); }
    const char* getBuffer() const override { return str.c_str(); }
    size_t size() const override { return str.size(); }
};
int main()
{
    MyString str1{"Hello World"};
    return 0;
}
 
    