简体   繁体   English

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

[英]Virtual destructor of an inherited template class

Can any one explain how delete x works correctly without virtual ~X()任何人都可以解释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;
}

Output: Output:

====
B()
C()
~C()
~B()
====
B()
C()
X()
Y()
~Y()
~X()
~C()
~B()
====

It is virtual – X<C> inherits C , the root of the hierarchy is B , and the destructor is declared virtual in B .它是虚拟的 - X<C>继承C ,层次结构的根是B ,析构函数在B中声明为虚拟。

The class templating is completely irrelevant; class 模板完全不相关; it works exactly as it would if you had它的工作原理与您拥有的完全一样

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; }
};

and

X* x = new Y;
delete x;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM