C++ - 继承,调用哪个基本构造函数? [复制]

Posted

技术标签:

【中文标题】C++ - 继承,调用哪个基本构造函数? [复制]【英文标题】:C++ - Inheritance, which base constructor is called? [duplicate] 【发布时间】: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的变量值?

【问题讨论】:

看看相关的***.com/questions/120876 【参考方案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)

【讨论】:

以上是关于C++ - 继承,调用哪个基本构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c++中用*this返回一个对象,会调用复制构造函数吗?

C++在单继承多继承虚继承时,构造函数复制构造函数赋值操作符析构函数的执行顺序和执行内容

C++复制、移动、交换、赋值和析构函数的继承?我需要哪个

C++:首先调用/初始化哪个?其成员变量的类构造函数或构造函数?

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

C++提高:继承