C++:继承和多态(1)

11_9继承和多态

1.类与类之间的关系
(1)友元
(2)组合

class A
{
};
class B
{
public:
	A a;
};

(3)嵌套:一个类声明另一个类,

class A
{
	class B
	{
	public:
		A a;
	};
};

(4)代理:一个类接口是另一个类接口的子集,一个类的功能需要依赖另一个类。

(5)继承:(基类和派生类)
子类无法访问父类的私有成员

class Person
{
public:
	void eat()
	{
		cout << "eat" << endl;
	}
	void work()
	{
		cout << "work work work……" << endl;
	}

protected:

private:
	string _name;
	int _age;
	string _sex;
};
class student :public Person
{
public:
	void show()
	{
		//以下四句会报错的原因
		cout << "name:" << _name << endl;
		cout << "age" << _age << endl;
		cout << "sex:" << _sex << endl;
		cout << "num:" << _num << endl;
	}

protected:
	string _num;
private:
};

在这里插入图片描述
类成员的访问属性划分:自身类,子类,外界。
public:公有成员,自身类,子类,外界都可以访问
private:私有成员,只有自身类可以访问,
protected:保护成员,子类和自身类可以访问
父类的构造函数如果要传参,就必须要写到初始化列表中

继承权限:子类继承的父类成员,在自身类中的权限不能高于继承权限

隐藏:
同名隐藏:派生类(子类)会隐藏父类的同名成员(加一个作用域),访问被隐藏的成员需要加上(父类)作用域
父类指针指向子类对象,调用父类
在这里插入图片描述

(6)属于:一个类是另一个类的一部分

2.多态
动多态定义:使用指针或者引用调用虚函数就会产生动多态
动多态调用过程:
(1)使用指针或者引用调用虚函数
(2)在对象中找到vfptr
(3)根据vfptr找到vftable
(4)在vftable中找到要调用的函数
(5)调用

3.vftable
编译时期如果发现类中有虚函数,就会对这个类生成vftable,(虚函数表),将当前类的虚函数的指针放到vftable中,
当对象构造的时候,如果发现该类有vftable,就会将vftable的地址写入到这个对象之中—vfptr,放到只读数据段(.rodata)
覆盖(重写):虚函数发生在vftable中,父类的虚函数会被子类中相同的函数覆盖,在子类的虚函数表中覆盖
虚函数具有传递性:父类中有虚函数,子类中对应的相同函数(同返回值,同函数名,同参数列表)会被传递为虚函数
重载,隐藏,覆盖:覆盖的函数之间会不会存在隐藏关系(同名就隐藏)。虚函数表的产生,动多态的调用过程。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值