一、菱形继承
菱形继承为多继承,以Person类、Student类,Teacher类,Assiatant类为例的菱形继承来说:
(1)菱形继承
通过查看内存地址,得出一般菱形继承的对象模型为:
从对象模型可以看出,一般的菱形继承存在两个问题:二义性与数据冗余
解决方法:菱形虚拟继承
(2)菱形虚拟继承
菱形虚拟继承代码:在菱形继承代码基础上添加virtual关键字
class Person
{
public:
int _age; //人的年龄
};
class Student:virtual public Person
{
public:
int _num; //学生的学号
};
class Teacher:virtual public Person
{
public:
int _id; //教师id编号
};
class Assistant:public Student,public Teacher
{
public:
int _major; //主修专业
};
(2)菱形虚拟继承的底层实现与对象模型
二、虚函数与多态、
虚函数:在成员函数前面加关键字virtual,则这个成员函数称为虚函数
虚函数重写:如果子类定义了一个与父类完全相同的虚函数,则称子类的你虚函数重写了父类的虚函数
class Person
{
public:
virtual void BuyTickets()
{
cout << "全票" << endl;
}
};
class Student:public Person
{
public:
virtual void BuyTickets()
{
cout<<"半价票"<<endl:
}
};
void Fun(Person& p)
{
多态:当使用父类的指针或引用调用重写的虚函数时,当指向父类调用的就是父类的虚函数,当指向子类时调用的就是子类的虚函数。