[英]Why are base Constructors inherited, How can i prevent it?
#include<iostream>
using namespace std;
int main(){
class c1{
public:
c1(){
cout<<"constructing c1";
}
};
class c2:private c1{
public:
c2(){
cout<<"constructing c2";
}
};
c2 inst1;
}
q1。 即使访问是私有的,为什么基地的指挥官也需要派生对象? 即为什么即使类c1
被继承为私有也为什么调用c1()
?
q2。 在这里c1是继承的,我如何防止这种情况发生?
它不是继承的。 c2
是 c1
。 有一个c1
子对象是c2
对象的一部分。
任何对象都需要构造才能使用,因此c2
构造函数将自动调用c1
c'tor(因为它没有参数,并且可以用于默认构造)。
如果您想了解更多有说服力的,出现这种情况,请尝试将参数传递给c1
c'tor:
c1(int){
cout<<"constructing c1";
}
现在它不能用于默认构造c1
。 您将得到一个不错的错误,可以通过使用一些整数值显式调用c2
的基类c'tor来解决该错误:
c2() : c1(0) {
cout<<"constructing c2";
}
这与私有或公共继承无关。 派生类的构造函数在基类的构造函数被调用之后被调用,析构函数以相反的顺序被调用。
这是面向对象编程的基本要点
在继承c1的情况下,如何防止这种情况发生?
简短答案:您无法阻止。 all parent objects as sub-objects, due to their inheritance. 由于继承,派生对象将所有父对象为子对象。 因此,为了整体上初始化对象,编译器别无选择,只能为每个子对象调用每个构造函数。
但是,可以通过使用某些参数调用父构造函数的行为来影响它的行为。 考虑一下:
class Base {
Data _data;
protected:
Base(bool load_from_cache) {
if(load_from_cache) _data = read_cache();
else _data = read_database();
}
};
class Derived : public Base {
public:
Derived() : Base{ true } { } // specify from where to read the data
};
注入自定义行为还有很多其他可能性,例如传递函数对象,lambda,CRTP等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.