继承中的构造函数调用顺序

调用派生类的构造函数之前先调用基类的构造函数,析构函数则相反。因为派生类需要用到基类的成员,所以必须先有基类,再有派生类。

C++语法规定:
如果类没有显示定义构造函数,则编译器提供一个默认构造函数(不带参数,仅创建对象,不初始化)。
如果类显示定义了构造函数,编译器一律不提供默认构造函数。即如果一个类定义了一个带参数的构造函数,还想要无参数的构造函数,则必须自己定义。

例如:
class Animal
{
public:
Animal(int height,int weight)
{
}
};

class Fish : public Animal
{
public:
     Fish()
     {
     }
};

编译出错:error C2512: 'Animal' : no appropriate default constructor available
调用Fish的构造函数时先调用 无参的基类构造函数,而这里没有,故实例化失败。

在不给基类添加无参的构造函数的前提下,要想编译通过,需要如下定义派生类:
class Fish : public Animal
{
public:
Fish(): Animal(300,400) // 添加一个初始化列表
{
}
};

这样可以成功构造Animal对象,便能够成功够构造Fish。
另外还有一种解决办法,就是给Animal构造函数提供默认参数,为所有形参提供默认实参的构造函数就是一个默认构造函数。

必须在构造函数初始化列表中进行初始化的类型(P388):
  • 没有默认构造函数的类类型成员。
  • const或引用类型(这两种类型的对象可以初始化但不能对它们赋值)。

另一篇文章“继承与构造函数”用一个例子说明了类对象的初始化过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值