继承中的构造和析构
类中成员的初始化:成员属于那个类,则必须要该类对其初始化,即调用该类的构造函数对其进行初始化(在对象初始化列表中显示调用)
派生类构造的顺序:先调用父类构造函数初始化父类成员,再调用自己的构造函数对自己的成员进行初始化
派生类中有其他类的对象的情况下的构造顺序:
1、调用父类构造函数
2、调用类中其余类对象的构造函数
3、调用派生类自己的构造函数
#include <iostream>
using namespace std;
class Test
{
public:
Test(int a)
{
cout << "Test 构造函数被调用" << endl;
}
~Test()
{
cout << "Test 析构函数被调用" << endl;
}
};
class A
{
public:
A()
{
cout << "A的 无参构造被调用" << endl;
}
A(int a, int b)
{
a1 = a;
a2 = b;
cout << "A的构造函数被调用" << endl;
}
~A()
{
cout << "A的析构函数被调用" << endl;
}
private:
int a1;
int a2;
};
/*
类中成员的初始化:成员属于哪个类,则必须要该类对其初始化
======>必须调用该类的构造函数对其进行初始化
======> 如何调用基类的构造函数?
======> 在对象初始化列表中显示调用
派生类构造顺序:1、先调用父类构造函数构造父类成员
2、再调用自己的构造函数对自己的成员进行初始化
析构的顺序和构造顺序相反
组合和继承在一起的时候构造的顺序:
1、先调用父类构造函数
2、再调用组合对象的构造函数
3、调用派生类自己的构造函数
析构的顺序和构造的顺序相反
*/
class B:public A
{
public:
B(): t1(1), t2(2), A(1,2)
{
cout << "B的构造函数被调用" << endl;
}
~B()
{
cout << "B的析构函数" << endl;
}
private:
Test t1;
Test t2;
};
class P1
{
public:
P1()
{
cout << "P1 的构造函数被调用" << endl;
}
~P1()
{
cout << "P1 的析构函数被调用" << endl;
}
};
class Child:public P1
{
public:
Child()
{
cout << "Child 的构造函数被调用" << endl;
}
~Child()
{
cout << "Child 的析构函数被调用" << endl;
}
};
int main()
{
//A a;
//B b;
Child c1;
return 0;
}
继承中的同名成员
派生类的同名成员符屏蔽基类的同名成员(继承过来的同名成员空间还是存在的)
如果需要使用基类成员,需要使用域解析符进行操作
重载:类中的函数重载必须在同一个类中进行
派生类中不能重载基类的函数,如果派生类重载了基类的函数,则会屏蔽所有基类的同名函数
基类中的静态成员函数被所有派生类所共享