目录
C++派生类的构造函数总结
1 简单的派生类的构造函数的一般形式 为:
2 有子对象的派生类的构造函数的一般形式为:
3 多层派生时的构造函数
4 多重继承(就是一个派生类从多个基类继承)
5 虚基类虚基类的作用:
6 基类与派生类的转换
C++派生类构造函数调用顺序
代码运行结果如下:
派生类构造函数调用顺序
最终结论:
C++派生类构造函数举例(多继承、含有内嵌对象)
首先,我们需要了解一下派生类构造函数执行的一般次序。
例子1:
结果:
例子2:
结果:
最后:
派生类构造函数名(总参数表):基类构造函数名(参数表)
{派生类中新增数据成员初始化语句}
派生类构造函数名(总参数表):基类构造函数名(参数表),子对象(参数表)
{派生类中新增数据成员初始化语句}
不要列出每一层派生类的构造函数,只需写出其上一层派生类(即它的直接基类)的构造函数
派生类的构造函数 派生类构造函数名(总参数表):基类1构造函数(参数表),基类2构造函数(参数表),基类3构造函数(参数表){派生类中新增数据成员初始化语句}
使得在继承间接共同基类时只保留一份成员声明虚基类的一般形式为: class 派生类名:virtual 继承方式 基类名经过这样的声明后,当基类通过多条路径被一个派生类继承时,该派生类只继承该基类一次,
也就是说,基类成员只保留一次注意:为了保证虚基类在派生类中只继承一次,
应当在该基类的所有所有直接派生类中声明为虚基类,否则仍然会出现对基类的多次继承在最后的派生类中不仅要负责对其直接基类进行初始化,
还要负责对虚基类初始化
派生类对象可以向基类对象赋值,只能用子类对象对基类对象赋值,而不能用基类对象对其子类对象赋值,
同一基类的不同派生类对象之间也不能赋值 派生类对象可以替代基类对象向基类对象的引用进行赋值或初始化
如果函数的参数是基类对象的引用,相应的实参可以用子类对象 派生类对象的地址可以赋给指向基类对象的指针变量,
也就是说,指向基类对象的指针变量也可以用来指向派生类对象 通过指向基类对象的指针,只能访问派生类中的基类成员,而不能访问派生类增加的成员
#include
#include
#include
using namespace std;
class Base
{
public:
Base() { cout << __PRETTY_FUNCTION__ << endl; }
Base(string s) { cout << __PRETTY_FUNCTION__ << endl; }
virtual ~Base() { cout << __PRETTY_FUNCTION__ << endl; }
};
class Member
{
public:
Member() { cout << __PRETTY_FUNCTION__ << endl; }
Member(string s) :s_(s) { cout << __PRETTY_FUNCTION__ << ":" << s_ << endl; }
~Member(){ cout << __PRETTY_FUNCTION__ << ":" << s_ << endl; }
private:
string s_;
};
class Derived: public Base
{
public:
Derived() : b("bbb"), a("aaa")
{ cout << __PRETTY_FUNCTION__ << endl; }
~Derived() { cout << __PRETTY_FUNCTION__ << endl; }
private:
Member a;
Member b;
};
int main(int argc, char *argv[])
{
Derived d;
return 0;
}
ubuntu:~/work/appcode/stdcplus$ ./misc
Base::Base()
Member::Member(std::__cxx11::string):aaa
Member::Member(std::__cxx11::string):bbb
Derived::Derived()
virtual Derived::~Derived()
Member::~Member():bbb
Member::~Member():aaa
virtual Base::~Base()
1:派生类先调用基类的构造函数.(基类Base()的构造函数)
2:派生类通过初始化列表初始化成员变量(Member a, Member b),调用Member::Member(string s)构造函数,
其中初始化顺序与成员变量声名顺序有关,与初始化列表先后顺序无关,这里是先初始化成员变量a,然后初始化
成员变量b.
3:最后调用派生类的构造函数Derived::Derived()
派生类的析构函数调用顺序与构造函数相反
派生类构造函数执行的一般次序:
①调用基类构造函数,调用顺序按照他们被继承时的声明的顺序(从左往右);
②调用内嵌成员对象的构造函数,调用顺序按照他们在类中的声明的顺序;
③派生类的构造函数体重的内容
举例说明:
这是一个具有一般性特征的例子,有三个基类B1、B2和B3,其中B3只有一个默认的构造函数,其余两个基类的成员只是一个带有参数的构造函数。类C由这三个基类经过公有派生而来。派生类新增加了三个私有对象成员,分别是B1、B2和B3类的对象.
#include
using namespace std;
class B1{
public:
B1( int i){cout<<"constructing B1 " <
constructing B2 2
constructing B1 1
constructing B3 *
constructing B1 3
constructing B2 4
constructing B3 *
①先根据 class C: public B2, public B1, public B3 依次调用函数;
②再根据B1 memberB1;B2 memberB2; B3 memberB3; 调用函数;
③在构造函数时 C( int a, int b, int c, int d):B1(a),memberB2(d),memberB1(c) ,B2(b) {} ,B1和memberB1要同时调用,B2和memberB2也要同时调用,否则会报错
#include
using namespace std;
class B1{
public:
B1( int i){cout<<"constructing B1 " <
constructing B2 2
constructing B1 1
constructing B3 5
constructing B1 3
constructing B3 6
constructing B2 4
今天的知识就讲到这里了,明天我来给大家讲一下C++类的多态!