继承中的构造函数调用顺序
2014-04-15 10:50
211 查看
调用派生类的构造函数之前先调用基类的构造函数,析构函数则相反。因为派生类需要用到基类的成员,所以必须先有基类,再有派生类。
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或引用类型(这两种类型的对象可以初始化但不能对它们赋值)。
另一篇文章“继承与构造函数”用一个例子说明了类对象的初始化过程。
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或引用类型(这两种类型的对象可以初始化但不能对它们赋值)。
另一篇文章“继承与构造函数”用一个例子说明了类对象的初始化过程。
相关文章推荐
- 继承中构造函数和析构函数的调用顺序
- C++类的继承中构造函数和析构函数调用顺序例子
- 理解C++存在继承和组合的对象构造函数调用顺序
- C++继承中构造函数和析构函数的调用顺序
- C++ 多继承构造函数初始化列表调用顺序
- C++多重继承,菱形继承中构造函数的调用顺序
- C++ 虚继承对基类构造函数调用顺序的影响
- c++类继承,构造函数和析构函数调用顺序
- C++继承关系中构造函数的调用顺序
- C#类的继承,构造函数实现及其调用顺序
- 【c++继承】继承关系中派生类对象构造函数和析构函数调用顺序
- C++继承中构造函数调用顺序
- java继承的构造函数调用顺序
- 继承中构造函数和析构函数地调用顺序
- 继承(加深)-构造函数调用顺序与函数重定义
- C++中多个类继承时构造函数与析构函数的调用顺序
- c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)
- 继承与派生,多继承,函数重载,构造函数调用顺序 静态多态和动态多态
- 继承中构造函数和析构函数地调用顺序
- 多继承且有内嵌对象时构造函数的调用顺序