c – 使用非虚拟父级从虚拟类继承的正确方法

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

#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 – 使用非虚拟父级从虚拟类继承的正确方法 - 代码日志