C++覆盖(override)

本文探讨了C++中虚函数与多态的概念,解释了如何通过虚函数实现运行时多态,以及非虚函数在基类和派生类中的调用行为。通过实验代码演示了虚函数和非虚函数的调用区别。

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

摘要

问题: 让一个基类指针指向派生类时,对于同名的成员函数,调用的是基类的还是派生类的?
答案: 这取决于基类成员函数是否是virtual的。
如果基类成员函数是virtual的,则成员函数为运行期绑定,即调用的是派生类成员函数。
如果基类成员函数不是virtual的,成员函数为编译期绑定,即调用的是基类成员函数。
其实,
类成员函数不是虚函数,根据指针类型来判断调用基类的函数还是派生类的函数,指针类型是什么就调用对应类的函数。
类成员函数是虚函数,根据指针所指向对象的类型来判断,例如所指向派生类,就调用派生类函数。
涉及知识点:C++覆盖(override)
C++的函数多态是通过虚函数来实现的,则调用某个同名函数时,


疑惑

让一个基类指针指向派生类时,对于同名的成员函数,调用的是基类的还是派生类的?

实验代码和结果

实验代码:

#include<iostream>
using namespace std;
class base
{
public:
	virtual void vir1() { printf("base vir1()\n"); }
	void vir2() { printf("base vir2()\n"); }
};
class derived : public base
{
public:
	void vir1() { printf("derived vir1()\n"); }
	void vir2() { printf("derived vir2()\n"); }
};

int main()
{
	base *p1 = new base;
	base *p2 = new derived;
	//derived *p3 = new base; //报错
	derived *p4 = new derived;

	printf("p1:\n");
	p1->vir1();
	p1->vir2();

	printf("p2:\n");
	p2->vir1();
	p2->vir2();

	printf("p4:\n");
	p4->vir1();
	p4->vir2();

	delete p1;
	delete p2;
	delete p4;

	return 0;
}

运行结果:

p1:
base vir1()
base vir2()
p2:
derived vir1()
base vir2()
p4:
derived vir1()
derived vir2()
请按任意键继续. . .

结论:
注意看这里

p2:
derived vir1()
base vir2()

可以推断出,
如果基类成员函数是virtual的,则成员函数为运行期绑定,即调用的是派生类成员函数。
如果基类成员函数不是virtual的,成员函数为编译期绑定,即调用的是基类成员函数。

涉及知识点

覆盖(override)*

覆盖构成条件和多态构成条件是相同的,覆盖是一种函数间的表现关系,而多态描述的是函数的一种性质,二者所描述的其实是同一种语法现象。
覆盖首先要求有继承关系,其次是要求构成继承关系的两个类中必须具有相同函数签名的成员函数,
并且这两个成员函数必须是虚成员函数,具备这两个条件后,派生类中的虚成员函数则会覆盖基类中的同名的虚成员函数。参考这里

相关/参考链接

http://www.weixueyuan.net/view/6375.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值