gpt4 book ai didi

c++ - 从具有非虚拟父类的虚拟类继承的正确方法

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

我编写了这个使用三种类型的测试代码:struct One 是一个没有虚成员的普通类型,struct Two : One 有一个纯虚函数和一个虚拟析构函数,struct Three : Two 实现了 Two 的接口(interface)。

#include <iostream>

struct One
{
~One() {
std::cout << "~One()\n";
}
};

struct Two : One
{
virtual ~Two() {
std::cout << "~Two()\n";
}

virtual void test() = 0;
};

struct Three : Two
{
virtual ~Three() {
std::cout << "~Three()\n";
}

virtual void test() {
std::cout << "Three::test()\n";
}
};

int main()
{
Two* two = new Three;
two->test();

One* one = two;
delete one;
}

不出所料,the output was这个:

Three::test()
~One()

除了让每个析构函数都成为虚拟函数之外,还有什么办法可以解决这个问题吗?或者程序员应该小心不要遇到这种情况?我觉得很奇怪,编译时没有警告。

最佳答案

唯一的“修复”是不通过指向 One 的指针删除对象。

这是否是一个常见问题,取决于您的类的使用方式。例如,标准库包含像 unary_function 这样没有虚拟析构函数的结构,但我们很少看到它被这样滥用。

关于c++ - 从具有非虚拟父类的虚拟类继承的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769259/

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