继承的模板类的虚拟析构函数

Mid*_*umo 2 c++ polymorphism templates

没有人能解释一下如何delete x正常工作吗virtual ~X()

#include <iostream>

struct B
{
    B()
    {
        std::cout << "B()" << std::endl;
    }
    virtual ~B()
    {
        std::cout << "~B()" << std::endl;
    }
};

struct C : B
{
    C()
    {
        std::cout << "C()" << std::endl;
    }
    virtual ~C()
    {
        std::cout << "~C()" << std::endl;
    }
};

template <class T>
struct X : T
{
    X()
    {
        std::cout << "X()" << std::endl;
    }
    ~X()
    {
        std::cout << "~X()" << std::endl;
    }
};

template <class T>
struct Y : X<T>
{
    Y()
    {
        std::cout << "Y()" << std::endl;
    }
    ~Y()
    {
        std::cout << "~Y()" << std::endl;
    }
};

int main()
{
    std::cout << "====" << std::endl;
    {
        B* b = new C;
        delete b;
    }
    std::cout << "====" << std::endl;
    {
        X<C>* x = new Y<C>;
        delete x;
    }
    std::cout << "====" << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

====
B()
C()
~C()
~B()
====
B()
C()
X()
Y()
~Y()
~X()
~C()
~B()
====
Run Code Online (Sandbox Code Playgroud)

mol*_*ilo 5

它是虚拟的- X<C>继承C,层次结构的根是B,析构函数在中声明为虚拟B

类模板完全不相关;它的工作原理与您拥有的完全一样

struct X : C
{
    X() { std::cout << "X()" << std::endl; }
    ~X() { std::cout << "~X()" << std::endl; }
};

struct Y : X
{
    Y() { std::cout << "Y()" << std::endl; }
    ~Y() { std::cout << "~Y()" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

X* x = new Y;
delete x;
Run Code Online (Sandbox Code Playgroud)