1、构造和析构的顺序
子类构造函数执行的时候,会先调用父类的默认构造函数。也可以显示的在子类构造函数后加:父类构造,去指定调用父类的哪个构造函数。
#include <iostream>
#include <cstring>
using namespace std;
class father
{
public:
father()
{
cout<<"father() ...."<<endl;
m_a = 0;
}
father(int a)
{
cout<<"father(int a) ...."<<endl;
m_a = a;
}
~father()
{
cout<<"~father()"<<endl;
}
int m_a;
};
class son : public father
{
public:
son()
{
cout<<"son() ...."<<endl;
m_b = 0;
}
son(int b):father(b)
{
cout<<"son(int a) ...."<<endl;
m_b = b;
}
~son()
{
cout<<"~son()"<<endl;
}
void print()
{
cout<<"a:"<<m_a<<", b:"<<m_b<<endl;
}
private:
int m_b;
};
int main(void)
{
son s1;
s1.print();
son s2(10);
s2.print();
return 0;
}
析构的顺序,跟之前说的一样,先构造的后析构,所以是先调用子类析构,再调用父类析构。
2、继承方式和访问权限
当父类和子类出现同名变量的时候,可以用作用域来访问。
3、类的赋值兼容性原则
(1)子类对象 可以 当做父类对象使用
(2)子类对象 可以 直接赋值给父类对象
(3)子类对象 可以 直接初始化父类对象
(4)父类指针 可以直接指向子类对象
(5)父类引用 可以直接引用子类对象
老子能指儿子,儿子可不敢指老子。
4、继承中的static
任然是在静态区的数据,只不过原来是属于某一个类的,现在属于整个家族。