菱形继承与多态

 


一、菱形继承

     菱形继承为多继承,以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)
{

多态:当使用父类的指针或引用调用重写的虚函数时,当指向父类调用的就是父类的虚函数,当指向子类时调用的就是子类的虚函数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值