多态实现原理

**摘要:**本文围绕 C++ 多态的实现条件与底层原理展开,重点讲解虚函数重写、父类指针或引用指向子类对象这两个核心条件,并结合虚函数表与虚函数指针的机制,说明多态调用是如何被触发的。文中通过监视窗口示意图和完整演示代码,直观展示子类重写虚函数后,父类引用指向不同对象时调用对应函数的过程。

目录

一、多态实现条件

1、子类必须重写父类的虚函数

2、由父类的指针或者引用指向子类对象

二、多态的原理

1、子类必须重写父类的虚函数

2、父类的指针或者引用指向子类对象


s

一、多态实现条件

1、子类必须重写父类的虚函数

虚函数的重写由两个例外

1、协变:协变的要求是返回值可以不同,但必须是父类的指针或者引用

2、派生类重写虚函数时,可以不写 virtual,继承虚属性;写上可读性更好。

2、由父类的指针或者引用指向子类对象

原理:通过虚函数表 +虚函数指针触发多态调用条件,

包含虚函数的类都有自己的虚函数表 ,并且在对象内存中有虚函数表指针 指向自己的虚函数表,

当用父类的指针或者引用指向子类对象 时,父类的指针或者引用 通过虚函数表指针 找到子类的虚函数表,最后调用子类重写后的虚函数。

问题:为什么不能是子类的指针或者引用

多态的核心目标是:同一个调用入口(指针 / 引用),指向不同类型的对象时,能自动调用对应类型的函数

**原因是子类的指针或者引用指向子类对象时,不能指向父类时调用父类的虚函数(语法不支持,不符合继承语义),只能做到指向子类的虚函数。**而父类的指针或者引用天然可以指向父类对象,也可以指向子类对象,可以做到通过一个调用入口,指向不同对象时,能够调用对应类型的函数

二、多态的原理

1、子类重写父类的虚函数监视窗口

子类得到父类的虚函数表,重写的虚函数会覆盖父类的虚函数。如下图所示

2、父类的引用指向子类对象监视窗口

首先对象内存模型中,有指向虚函数表的指针 ,虚函数表指针 指向虚函数表 ,虚函数表 中存放的是虚函数的地址

当父类的引用p指向了父类对象,调用的是父类的虚函数。

当父类的引用p指向了子类对象,调用的是子类重写父类后的虚函数。

3、演示代码

复制代码
class Person
{
public:
	virtual void BuyTicket()
	{
		cout << "票价-全价" << endl;
	}
	virtual void func1()
	{
		cout << "Person::func1()" << endl;
	}
	virtual void func2()
	{
		cout << "Person::func2()" << endl;
	}
private:
	int _a=1;
};
class Student : public Person
{
public:
	virtual void BuyTicket()
	{
		cout << "票价-半价" << endl;
	}
private:
	int _b=2;
};

void func(Person& p)
{
	p.BuyTicket();
}
int main()
{
	Person p;
	Student st;
	func(p);
	func(st);
}
相关推荐
2601_962885729 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen9 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
All for pursuit.9 小时前
【位运算-1】338.比特位计数
数据结构·c++·算法·leetcode
我可能是个假开发9 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
小师兄吃牛肉10 小时前
C语言中的nullptr有必要吗
c语言·c++·算法
WL学习笔记10 小时前
日期类(C++)
开发语言·c++·日期类实现
谢亮_vipxieliang11 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛11 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
xxwl58511 小时前
数据结构知识点和代码实现总结(C语言实现)
c语言·开发语言·数据结构
汉克老师12 小时前
GESP2026年9月认证C++八级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程