#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。即使访问是私有的,为什么基地的c被调用派生对象?
即使将c1()
作为私有继承,为什么c1
也会被调用?
Q2。这里c1是继承的,我怎样才能防止这种情况发生?
答案 0 :(得分:2)
它没有被继承。 c2
是-a c1
。有一个c1
子对象是c2
对象的一部分。
需要构造任何对象才能使用,因此c2
构造函数会自动调用c1
c&#tor;因为它没有参数,可以用作默认值构造)。
如果您想进一步说服这种情况发生,请尝试在c1
c上添加一个参数:
c1(int){
cout<<"constructing c1";
}
现在它不能用于默认构造c1
。您将收到一个很好的错误,可以通过显式在c2
中使用某个整数值调用基类c来解决:
c2() : c1(0) {
cout<<"constructing c2";
}
答案 1 :(得分:0)
这与私有或公共继承无关。 派生类的构造函数在调用基类的构造函数之后调用,析构函数以相反的顺序调用。
它是面向对象编程的基本关键点
答案 2 :(得分:0)
这里继承了c1,我该如何防止这种情况发生?
简短回答:你无法阻止它。 由于它们的继承,派生对象包含所有父对象作为子对象。因此,为了整体初始化对象,编译器别无选择,只能为每个子对象调用每个构造函数。
但是,您可以通过使用某些参数调用它来影响父构造函数的行为。考虑一下:
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,你说的。