1,赋值兼容性
1,子类对象可以当做父类对象使用
2,子类对象可以直接赋值给父类对象
3,子类对象可以直接初始化父类对象
4,父类指针可以直接指向子类对象
5,父类引用可以直接引用子类对象
看下面一段代码
#include <cstdlib>
#include <iostream>
using namespace std;
class Parent
{
protected:
const char* name;
public:
Parent()
{
name = "Parent";
}
void Print()
{
cout<<"Name:"<<name<<endl;
}
};
class Child : public Parent
{
protected:
int i;
public:
Child(int i)
{
this->name = "Child";
this->i = i;
}
};
int main(int argc, char *argv[])
{
Child c(1000);
Parent p = c;
Parent* pp = &c;
Parent& rp = c;
p.Print();
pp->Print();
rp.Print();
return EXIT_SUCCESS;
}
2,继承对象模型
类在c++编译器内部可以理解为结构体
子类是由父类成员叠加子类新成员得到的
3,继承与构造
在子类对象构造的时候需要调用父类构造函数对其继承得来的成员进行初始化
4,继承与析构
在子类对象析构的时候需要调用父类的析构函数对其继承得来的成员进行处理
这个例子验证了上面所说的。
5,继承的构造与析构
1,子类对象在创建时会首先调用父类的构造函数
2,父类构造函数执行结束后,执行子类的构造函数
3,当父类的构造函数有参数时,需要在子类的初始化列表中显示调用,析构函数调用的先后顺序与构造函数相反。
6,继承与组合的混搭
1,类中的成员变量可以是其它类的对象
例:
上面的例子说明了,如果一个类继承自父类并且有其它的对象作为成员,构造函数调用的先后顺序、
7,同名成员变量
当子类中定义的成员变量与父类中的成员变量同名时会发生什么?
当子类成员变量与父类成员变量同名时
1,子类依然从父类继承同名成员
2,在子类中通过作用域分别符::进行同名成员区分
3,同名成员存储在内存中的不同位置
例: