繁体   English   中英

为什么基本构造函数会被继承,我该如何预防?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM