C ++ - 继承,哪个基本构造函数被调用?

时间:2015-08-22 20:47:14

标签: c++ inheritance

我写了一个测试程序:

Template Loader Error:
Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
Using loader django.template.loaders.app_directories.Loader:

该程序输出以下内容:

#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;
}

有没有办法将一个整数参数发送到基类,从而调用基本构造函数的另一种形式?

如果base只有一个构造函数,我会得到一个编译错误:$ ./a.out base 1 child ,正如您所料。但是如果我给那个构造函数赋一个默认参数,比如:

candidate expects 1 argument, 0 provided

然后我的程序编译并运行,输出:base(int a = 10) 。 (有趣的?)

有没有办法传递base a=10的变量值?

2 个答案:

答案 0 :(得分:5)

您可以在派生类

的构造函数的mem-initializer列表中调用基本构造函数
    child() : base( 10 )
    {
            std::cout << "child" << std::endl;
    }

另一种方法是在派生类

中使用声明
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

答案 1 :(得分:2)

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

child() : base(1)