【问题标题】:C++ - Inheritance, which base constructor is called? [duplicate]C++ - 继承,调用哪个基本构造函数? [复制]
【发布时间】:2015-11-16 14:19:30
【问题描述】:

我写了一个测试程序:

#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的变量值?

【问题讨论】:

标签: c++ inheritance


【解决方案1】:

你可以在派生类的构造函数的mem-initializer列表中调用基构造函数

    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

【讨论】:

  • 啊!我希望这是可能的,谢谢!
【解决方案2】:

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

child() : base(1)

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多