继承,基构造函数被调用

C++ - Inheritance, which base constructor is called?

本文关键字:调用 构造函数 继承      更新时间:2023-10-16

我写了一个测试程序:

#include <iostream>
class base
{
        public:
        base()
        {
                std::cout << "base 1" << std::endl;
        }
        base(int a)
        {
                std::cout << "base a=" << a << std::endl;
        }
};
class child : public base
{
        public:
        child()
        {
                std::cout << "child" << std::endl;
        }
};
int main(int argc, char* argv[])
{
        child c;
        return 0;
}

程序输出如下内容:

$ ./a.out
base 1
child

是否有任何可能的方法发送整数参数到基类,从而调用基类构造函数的另一种形式?

在base只有一个构造函数的情况下,我得到一个编译错误:candidate expects 1 argument, 0 provided,正如您可能期望的那样。但是如果我给构造函数一个默认参数,比如:

base(int a = 10)

则我的程序编译并运行,输出为:base a=10。(有趣吗?)

是否有办法传递a的变量值?

可以在派生类的构造函数的初始化列表中调用基类构造函数

    child() : base( 10 )
    {
            std::cout << "child" << std::endl;
    }
另一种方法是在派生类 中放置using声明。
class child : public base
{
        public:
        using base::base;
        child()
        {
                std::cout << "child" << std::endl;
        }
};

在这种情况下,派生类也将具有带参数的构造函数,该构造函数将使用基类的参数调用相应的构造函数。

下面是一个示范程序

#include <iostream>
int main()
{
    class base
    {
        public:
        base()
        {
                std::cout << "base 1" << std::endl;
        }
        base(int a)
        {
                std::cout << "base a=" << a << std::endl;
        }
    };
    class child : public base
    {
        public:
        using base::base;
        child()
        {
                std::cout << "child" << std::endl;
        }
    };
    child c( 10 );
}            

程序输出为

base a=10

您可以使用:语法调用非默认构造函数:

child() : base(1)