在我的第一个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
的方法和数据成员。我是对还是错?
析构函数,复制构造函数和赋值运算符怎么样? 上面的原因(假设它是正确的)也适用于它们吗?
此致 罗恩
答案 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。