gpt4 book ai didi

c++ - C++ 中的虚拟析构函数与普通方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:58 24 4
gpt4 key购买 nike

考虑以下三个 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)

我想知道为什么我无法在类定义之外定义虚拟析构函数,但我可以在类定义内定义它。此外,我可以在类之外定义方法,但不能定义析构函数。

最佳答案

这是错误的

struct base{
virtual ~base() =0;
};

因为 base::~base 没有定义。即使它已被声明为纯虚函数,也需要对其进行定义(在类之外,没有语法方法可以将函数声明为纯虚函数并内联定义它)因此 derived 可以继承来自它:

struct base
{
virtual ~base() = 0;
};

base::~base() {}

I'd like to know why I am unable to define virtual destructors outside of the class definition

好吧,你可以:我刚刚做到了。


那么,为什么要实现一个声明为纯虚的函数(~base)?

由于derived继承自base,当一个derived类型的对象被析构时,它必然调用base的析构函数。这就是继承的工作方式。从某种意义上说,derived::~derived 需要链接到base::~base。尽管 base::~base 是纯虚拟的(意味着从 base 继承的类不是完整类型,除非它定义了析构函数)它需要 被定义以便 ~derived 找到它并且链接器变得快乐。

关于c++ - C++ 中的虚拟析构函数与普通方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50335026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com