为什么基础构造函数继承,我该如何防止它?

时间:2017-10-26 07:47:19

标签: c++ inheritance

#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是继承的,我怎样才能防止这种情况发生?

3 个答案:

答案 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,你说的。