【问题标题】:Constructor, destructor, overloaded =operator function, copy constructor do not get inherited. What this exactly means?构造函数、析构函数、重载 =operator 函数、复制构造函数不会被继承。这究竟意味着什么?
【发布时间】:2021-09-10 10:55:30
【问题描述】:

代码

#include<iostream>
struct A
{
    ~A()
    {
        std::cout<<"dctorA\n";
    }
};
struct B: public A
{
    ~B()
    {
        std::cout<<"dctorB\n";
    }
};

int main()
{
    B b1;
    b1.~A();
}

输出

dctorA
dctorB
dctorA

如果析构函数没有继承,那么我如何通过 B 的对象调用它?

我知道规则三和五,但编译器工作时不管是否遵循规则。所以为了避免复杂性,我避免编写复制构造函数和重载 = 运算符。

【问题讨论】:

  • 你从哪里得到的信息,那些不是继承的?
  • 嗯,这并不完全正确,实际上大部分是错误的。 Here's a list of good books,我建议你投资其中之一。
  • 顺便说一句,你几乎不应该像b1.~A()那样明确地使用析构函数。尤其不是父类的析构函数。
  • C++ Primer Plus 不要与 C++ Primer 混淆。作者是不同的,前者被认为不太受欢迎,以至于《好书清单》指出了这一点。
  • @AbhishekMane -- 删除b1.~A();,因为这是完全错误和不必要的。现在你遇到了什么问题?

标签: c++ inheritance destructor


【解决方案1】:

该语句想说的是,当您添加 A::A(int) 时,class B 不会自动获得构造函数 B::B(int)。同样,B::operator=(int) 不会在您拥有A::operator=(int) 时自动生成。

可以自动生成复制构造函数B::B(B const&amp;),在这种情况下它需要A::A(A const&amp;)。但是你从参数中看到它是生成的,而不是继承为B::B(A const&amp;)

析构函数的工作方式相同 - 生成,而不是继承 - 但由于没有参数,因此不太明显。

【讨论】:

  • 首先感谢您的回答。我为基类和派生类编写了构造函数、复制构造函数、重载 = 运算符和析构函数,但我没有创建任何东西。但是所有功能都可以正常工作,例如构造函数、复制构造函数、重载 = 运算符和析构函数,这意味着编译器会自动正确生成它们。这与您的第一条语句相矛盾,即如果我们在基类中手动编写构造函数、重载 = 运算符,则不会为派生类自动生成它们。
  • 请回复。
  • @AbhishekMane:我重新检查了我原来的答案;这是正确的。 operator= 好像所有的函数都可以重载,所以我特地给了operator=(int) 作为例子,不是自动生成的。转换构造函数也是如此。
  • @AbhishekMane:有关详细信息,请查看您的书,但只有在基类和成员允许的情况下才会生成两者。不可移动的成员将阻止包含类的移动分配。
  • @AbhishekMane:如果您有新问题,请不要将其放在答案的评论部分。几乎没有人在那里看到它。
猜你喜欢
  • 2011-12-27
  • 2015-04-11
  • 2012-11-14
  • 1970-01-01
  • 2013-08-27
  • 2016-03-24
相关资源
最近更新 更多