C++多态意义探究

本文详细解析了C++中的多态实现原理,包括继承、虚函数重写及父类指针指向子类对象三个关键要素。通过示例代码展示了如何使用虚函数实现运行时多态,并解释了虚函数表的工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理简介:

多态成立的三个条件:

  1. 存在继承
  2. 虚函数重写
  3. 父类指针指向子类对象

之前有看过一个例子:

 1 #include <iostream> 
 2 using namespace std; 
 3 
 4 class Father
 5 {
 6 public:
 7     void Face()
 8     {
 9         cout << "Father's face" << endl;
10     }
11 
12     virtual void Say()
13     {
14         cout << "Father say hello" << endl;
15     }
16 };
17 
18 class Son:public Father
19 {
20 public:     
21     void Say()
22     {
23         cout << "Son say hello" << endl;
24     }
25 };
26 
27 void main()
28 {
29     Son son;
30     Father *pFather=&son; 
31     pFather->Say();
32 }

总感觉这边可以就在编译的时候确定绑定是哪一个函数,没有必要等到运行时在确定,然后就在思考多态的意义。

后来发现如果代码变成这样时:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Parent
 5 {
 6 public:
 7     virtual void print() 
 8     {
 9         cout<<"父类"<<endl;
10     }
11 };
12 
13 class Child : public Parent
14 {
15 public:
16     virtual void print()
17     {
18         cout<<"子类"<<endl;
19     }
20 };
21 
22 void HowToPlay(Parent *base)
23 {
24     base->print(); 
25 }
26 
27 int main()
28 {
29     Parent p1;            
30     Child c1; 
31     HowToPlay(&p1);
32     HowToPlay(&c1);
33     return 0;
34 }

HowToPlay()函数中,传来子类时,执行子类的print函数,传来父类时执行父类的print函数。

于是C++编译器根本不需要区分是子类对象,还是父类对象。父类对象和子类对象分别有vptr指针,先找到虚函数表,再找到函数的入口地址。

这样一种迟绑定的机制可以不需要区分是父类对象还是子类对象,重用base->print()而无需改变。

其实关键是看base指针指向了父类还是子类。

 

转载于:https://www.cnblogs.com/longlively/p/9289276.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值