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

时间:2011-08-26 18:04:33

标签: c++ inheritance

在我的第一个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不会继承所有四个,但为什么?对于构造函数 - 我 认为如果B继承A的构造函数,那么代替 创建一个更大的对象(一个B对象,因为B继承自A, 然后它将是一个更大的对象)我们创建一个较小的对象,没有 B的方法和数据成员。我是对还是错?

析构函数,复制构造函数和赋值运算符怎么样? 上面的原因(假设它是正确的)也适用于它们吗?

此致 罗恩

3 个答案:

答案 0 :(得分:1)

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

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

如果没有虚拟内存,则会出现内存泄漏。

正如其他人所指出的,赋值运算符将被继承。我怀疑潜在的赋值运算符的用处是有限的。

编辑:

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

答案 1 :(得分:0)

构造函数不是继承的。其他一切都是。可以这样想:继承是聚合的特例。即你的例子等于

class A
{
...
}

class B
{
public:
  A a;
}

这里A保留了它的所有属性,但是它没有为B提供构造函数。当你进行继承时会发生同样的情况,期望你不需要指定a来解决内容A

答案 2 :(得分:0)

以这种方式思考:B是A的特殊类型。(B不完全是A.)因此,B可能还有一些数据成员,也需要创建/销毁。这是不可能通过使用A&amp; ctor,dtor等。或者,即使B没有任何更多的数据成员,它也可能以不同的方式进行构造/破坏。

派生类是基类的专用版本,因此需要自己的ctor / dtor。