我们不能从基类继承什么:为什么

what we cannot inherit from a Base class : why?

本文关键字:什么 为什么 继承 基类 不能 我们      更新时间:2023-10-16

在我的第一个c++课程结束后,我有一些问题,我想为自己澄清。

不能继承以下内容(c++标准不允许):构造函数、复制构造函数、赋值操作符和析构函数。因此,如果我们输入:

    #include <iostream>
    using namespace std;
    class A
    {
    public:
        A() {cout << "CTOR of A" << endl;}
        ~A() {cout << "DTOR of A" << endl;}
        A (const A &) {cout << "Cctor of A" << endl;}
        A& operator =(const A& other) {/* some code */}
    };
    class B : public A
    {
        /* B's data members and methods */
    };
    int main()
    {
        /* code */
        return 0;
    }

B不会继承所有四个,但是为什么呢?对于构造函数I认为如果B继承A的构造函数,则代替创建一个更大的对象(一个B对象,因为B继承自a),那么它将是一个更大的对象)我们将创建一个更小的对象,没有B的方法和数据成员。我是对还是错?

那么析构函数、复制构造函数和赋值操作符呢?上面的原因(假设它是正确的)也适用于他们吗?

的问候罗恩

多重继承是不继承构造函数的原因之一。复制构造函数在这方面并不特殊。

struct B1 {
  virtual ~B1() {}
  B1(int a);
};
struct B2 {
  virtual ~B2() {}
  B2(int a);
};
struct D : public B1, public B2 {
};

在这种情况下,不清楚哪一个是合适的。

我个人认为不继承它们的实现意图会更清晰,尽管这可能不是语言设计者会说明的原因。

如果想继承析构函数,可以并且应该定义虚的析构函数

class A {
public:
  virtual ~A() {cout << "DTOR of A" << endl;
};

没有虚拟,你会内存泄漏。

如前所述,赋值操作符将被继承。不过,我隐约怀疑继承赋值操作符的有用性会受到限制。

编辑:

进一步阅读,非虚析构函数实际上是未定义行为。在实践中,它只是显示为内存泄漏。

构造函数不能被继承。其他的都是。可以这样想:继承是聚合的一种特殊情况。例如,你的例子等于

class A
{
...
}
class B
{
public:
  A a;
}

这里A保留了它所有的属性,但是它没有为b提供构造函数。同样的情况也发生在你做继承时,期望你不需要指定a来处理A的内容。

这样想:B是a的特殊类型(B不完全是a)。因此,B可能有更多的数据成员,这些数据成员也需要创建/销毁。这是不可能使用A的医生,医生等。或者,即使B没有更多的数据成员,它也可能以不同的方式进行构造/销毁。

派生类是基类的特化版本,因此需要它们自己的tor/dr .