我们不能从基类继承什么:为什么
what we cannot inherit from a Base class : why?
在我的第一个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 .
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么是 std::exception::what() 以及为什么要使用它?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 为什么此指针值不能转换为整数的规则是什么?
- 这是什么代码?为什么它有效?C++
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 什么是流的标记,为什么流中只有 1 个标记?
- 什么是非营利组织???我的问题是我不明白为什么有人会使用它
- scanf( "%d" , array[i] + 1)是什么意思?为什么+1在那里?
- 什么'!((n % 5 != 0) ||(n % 20 == 0))'变身?为什么呢?我似乎不明白
- 长有什么问题?为什么自动减去 1?
- 为什么我在启动任务时收到成功代码,但它什么也不做?
- 抽象类的需求是什么?为什么要通过其基类访问派生类方法?在C++
- 代币做什么?为什么需要在C++编程中创建代币
- 在iOS中使用Objective-C背后的哲学是什么?为什么不使用c++呢?
- c++中的回调地狱是什么?为什么它会泄漏内存?
- 我们不能从基类继承什么:为什么
- LookupAddressForName的作用是什么?为什么它如此缓慢