【发布时间】:2018-10-24 09:24:00
【问题描述】:
考虑以下三个 C++ 程序:
程序 1
struct base{
virtual ~base() =0;
};
struct derived: public base{
~derived();
};
derived::~derived(){}
int main(){}
程序 2
struct base{
virtual ~base() =0;
};
struct derived: public base{
~derived(){}
};
int main(){}
程序 3
struct base{
virtual void func() =0;
};
struct derived: public base{
void func();
};
void derived::func(){}
int main(){}
程序 #2 和 #3 编译并运行良好,但第一个程序给出以下错误:
Undefined symbols for architecture x86_64: "base::~base()", referenced from: derived::~derived() in main-d923b9.o ls: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
我想知道为什么我不能在类定义之外定义虚拟析构函数,但是我可以在类定义中做到这一点。此外,我可以在类之外定义方法,但不能定义析构函数。
【问题讨论】:
-
这在我看来不像 JavaScript 吗? C++ 标签会更适合这个问题
-
抱歉,我忘了从我问的上一个问题中更改它。还要感谢构造函数与析构函数的捕获。但是这个问题仍然有效
-
这些代码示例都没有实际编译(或提供您发布的链接器错误)。请提供真实的minimal reproducible examples,不要随意发明代码
-
virtual ~base() =0;pure virtualvirtual ~base() {}virtualvirtual ~base() =0 {};pure virtual with impl -
必须定义一个纯虚析构函数,并且由于语法问题,它只能在类定义之外完成。
标签: c++ destructor virtual-functions virtual-destructor