【问题标题】:How to use destructor with inheritance?如何使用带有继承的析构函数?
【发布时间】:2021-06-28 14:31:45
【问题描述】:

假设我有对象:B Ob1,C Ob2。我想为 B 和 C 类构建一个析构函数,但我不确定如何销毁 B.bb 和 C.cc 以及如何访问它们。另外,有没有一种方法可以让我在不与 A 班交朋友的情况下做到这一点?

class A
{
protected:
   int a, aa;
public:
   A();
   A(int a, int aa);
   ~A();
   friend class B;
   friend class C;
};
class B
{
protected:
   int b;
   A bb;
public:
   B();
   A(int b, A bb);
   ~B();
};
class C: class B
{
private:
   int c;
   A cc;
public:
   C();
   C(int c, A cc);
   ~C();
  };

【问题讨论】:

  • 不需要朋友,也不需要非默认析构函数。这些类太简单了,现在不需要担心这个。
  • 您可以像现在一样在B 中为A 创建构造函数。
  • 方便阅读:The Rule of Three/Five/Zero.

标签: c++ oop inheritance destructor


【解决方案1】:

你没有。它们会自动销毁。 friends 不需要这样做。

【讨论】:

    【解决方案2】:

    一旦你使用继承,析构函数应该是虚拟的:

    class B
    {
        ...
    public:
       B();
       A(int b, A bb);
       virtual ~B();
    };
    

    理由是,一旦你使用多态性和指针,坏事就可能发生:

    B *obj = new C();
    ...
    delete obj;       // if ~B is not virtual, you never call C destructor...
    

    【讨论】:

    • "只要你使用继承" ...这有点过于简单了。如果您不打算通过基类指针销毁对象,则不需要虚拟基类析构函数。
    • @TedLyngmo:你当然是对的。出于这个原因,我说应该而不是必须。但在不了解完整使用上下文的情况下,我建议 C++ 初学者遵循该规则,因为它很简单。它可能不会导致最有效的代码,但至少它应该是无害的,除非您需要像 POD 类这样的特殊属性。
    • 知道了-在答案中可能值得一提的是为什么您建议将它们设为虚拟。你会得到我的投票:-)
    • @TedLyngmo:我试图变得懒惰。很高兴你在这里:-)
    • 很高兴为您服务:-)
    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2021-04-13
    • 2012-11-14
    • 2016-03-23
    • 2011-04-04
    相关资源
    最近更新 更多