代码之家  ›  专栏  ›  技术社区  ›  Overv

通过删除基类来破坏派生类

  •  1
  • Overv  · 技术社区  · 15 年前

    #include <iostream>
    
    class A
    {
    public:
        A() { std::cout << "A created!" << std::endl; }
        ~A() { std::cout << "A destroyed!" << std::endl; }
    
        virtual const char* Name() { return "A"; }
    };
    
    class B : public A
    {
    public:
        B() { std::cout << "B created!" << std::endl; }
        ~B() { std::cout << "B destroyed!" << std::endl; }
    
        const char* Name() { return "B"; }
    };
    
    int main()
    {
        A* a = new B();
    
        std::cout << a->Name() << "\n";
    
        delete a;
    
        return 0;
    }
    

    我希望B被摧毁,而A也被摧毁。这在它的析构函数中是可能的还是我必须实现一个virtual Destroy()方法或类似的东西?

    3 回复  |  直到 15 年前
        1
  •  3
  •   tdammers    15 年前

    根据经验,如果您的任何方法是虚拟的,那么析构函数也必须是虚拟的。如果不是,则由声明的变量类型决定调用哪个析构函数,而这几乎不是您想要的。99.9%的情况下,您需要运行时类型的析构函数。

        2
  •  1
  •   SigTerm    15 年前

    这在它的析构函数中是可能的还是我必须实现一个virtual Destroy()方法或类似的东西?

    使虚拟的析构函数。

     virtual ~A() { std::cout << "A destroyed!" << std::endl; }
    

        3
  •  0
  •   Donato Szilagyi    11 年前