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++在单继承多继承虚继承时,构造函数复制构造函数赋值操作符析构函数的执行顺序和执行内容
C++:首先调用/初始化哪个?其成员变量的类构造函数或构造函数?