簡體   English   中英

添加析構函數后對 vtable 的未定義引用

[英]Undefined Reference to vtable After Adding Destructor

我查看了對 vtable 的 Undefined 引用,但即使添加了析構函數,我仍然遇到類似的錯誤:

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

以下代碼正在創建我自己的字符串 class,但使用 cstrings 的適配器。 它們(MyString 和 CStringAdapter 類)繼承自純虛擬 class isString。 我只是想了解如何使用適配器; 我知道創建自己的字符串 class 是毫無意義的。 我正在使用 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;
}

您沒有定義成員函數isString::getBufferisString::size 你需要定義它們。

如果您不希望 class 具有這些函數的定義,則必須將它們標記為pure virtual ,使isString成為無法直接實例化的抽象基礎 class :

virtual const char* getBuffer() const = 0;
virtual size_t size() const = 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM