C++中的继承构造函数

msc*_*msc 2 c++ inheritance constructor c++11

我正在尝试用C++ 实践继承构造函数.我已经编译并在gcc中运行以下程序,它运行正常.

#include<iostream>
using namespace std;

class Base1
{
public:
        Base1()
        {
                cout<<"Base1 Default Constructor\n";
        }
        Base1(int i)
        {
                cout<<"Base1 parametrized Constructor\n";
        }
};

class Base2
{
public:
        Base2()
        {
                cout<<"Base2 Default Constructor\n";
        }
        Base2(const string& s)
        {
                cout<<"Base2 parametrized Constructor\n";
        }
};

class Derived :public Base1, public Base2
{
public:
        using Base1::Base1;
        using Base2::Base2;
};

int main()
{
        Derived d1(3);        // OK 
        Derived d2("hello");  // OK 
}
Run Code Online (Sandbox Code Playgroud)

输出:

Base1 parametrized Constructor
Base2 Default Constructor
Base1 Default Constructor
Base2 parametrized Constructor
Run Code Online (Sandbox Code Playgroud)

但是,我想知道,为什么默认构造函数被调用?

Nat*_*ica 6

正在调用默认构造函数,因为Derived继承自Base1Base2.在构造Derived对象时,需要构造这两个基础.所以,当你这样做

Derived d1(3);
Run Code Online (Sandbox Code Playgroud)

你打电话Base1(int i).现在您需要构造Base2零件,因为您没有指定方式,编译器默认构造它.同样的事情发生在

Derived d2("hello");
Run Code Online (Sandbox Code Playgroud)

由于您未指定如何在构造函数中构造Base1零件,因此编译器默认为您构造零件.然后Base2(const string& s)调用构造Base2部分.

基本上你拥有的是什么

class Derived :public Base1, public Base2
{
public:
        Derived(int n) : Base1(n), Base2() {}
        Derived(const std::string& str) : Base1(), Base2(str) {}
};
Run Code Online (Sandbox Code Playgroud)