我使用以下代码获得以下链接器错误:
template<class T_Extendable>
class IBase
{
public:
virtual ~IBase() = default;
virtual const std::string& Name() const = 0;
};
template<class T_Extendable>
class Base : public IBase<T_Extendable>
{
public:
virtual ~Base() { "Destructing " << Name(); } // use virtual function Name()
};
class Derived : public Base<Foo>
{
public:
virtual ~Derived() = default;
const std::string& Name() const final { return "Derived"; } // implement pure virtual method IBase::Name()
};
IBase :: Name()const'`
注意在Base类中,它调用虚函数Name()。目的是调用Derived类的Name实现,但链接器正在查找IBase :: Name,而不是Derived :: Name()。如何解决这个问题?
File "$%MY_ENV_VAR%\..\..\Other Stuff\myFile.txt"
答案 0 :(得分:3)
您正在从析构函数中调用虚函数。通过标准的对象生存期规则,这意味着即使被销毁的对象是Derived
,当Base
析构函数运行时,它也不再能够访问派生最多的类型(在此case Derived
的)虚函数覆盖。因此,它尝试调用IBase
中声明的版本,该版本未定义,因此会出现链接器错误。
注意:这是标准的相关部分,它指定了这种行为[class.cdtor]:
可以调用4个成员函数,包括虚函数(10.3) 在施工或毁坏期间(12.6.2)。当一个虚函数 从构造函数或从构造函数直接或间接调用 析构函数,包括在构造或破坏期间 class的非静态数据成员,以及调用的对象 适用于建造或销毁的对象(称之为x), 调用的函数是构造函数中的最终重写者 析构函数的类,而不是在更派生的类中重写它。