基类指针调用派生类函数_C++ 多态性:虚函数--基类与派生类类型转换(第7章 05)例子问题解析(学习笔记:第8章 05)...

虚函数[1]

问题:还记得第7章的例子吗[2]

例7-3 类型转换规则举例

#include <iostream>
using namespace std;
class Base1 { //基类Base1定义
public:
	void display() const {
		cout << "Base1::display()" << endl;
	}
};
class Base2 : public Base1 { //公有派生类Base2定义
public:
	void display() const {
		cout << "Base2::display()" << endl;
	}
};
class Derived : public Base2 { //公有派生类Derived定义
public:
	void display() const {
		cout << "Derived::display()" << endl;
	}
};

void fun(Base1 *ptr) {  //参数为指向基类对象的指针
	ptr->display();     //"对象指针->成员名"
}
int main() {    //主函数
	Base1 base1;    //声明Base1类对象
	Base2 base2;    //声明Base2类对象
	Derived derived;    //声明Derived类对象

	fun(&base1);    //用Base1对象的指针调用fun函数
	fun(&base2);    //用Base2对象的指针调用fun函数
	fun(&derived); //用Derived对象的指针调用fun函数

	return 0;
}

程序运行结果:

dc5951e5721d82d0537331aea796dd52.png

对程序的一些说明:

程序的本意时希望能够写一个通用的显示函数fun(),根据需要指向不同的派生对象,然后调用各自display函数。但是没有达到这个期望的效果。
运行结果都是调用Base1的display函数。 所以建议不要重新定义继承而来的非虚函数。
  • 为什么程序没有达到期望效果?

在编译阶段,编译器根据指针无法去判断在运行时它会指向一个什么类型的对象。

  • 用虚函数能解决上述问题的原理:

在编译阶段没法正确地决定,就推迟这个决定,留到运行时在确定。程序运行时就能够知道指针在某个时刻指向的实际对象。

  • 怎么实现上述原理:

添加一个virtual关键字即可。它的意思是指示编译器不要在编译阶段做静态绑定,要为运行阶段做动态绑定做好准备。

注意:加了virtual的虚函数都要在类外去实现函数体,不能写成内联函数(因为内联函数是静态绑定的)。

例8-4通过虚函数实现运行时多态

现在我们来改进一下第7章的程序:同原型的函数在类外写成虚函数。

#include <iostream>
using namespace std;

class Base1 {
public:
	virtual void display() const;  //虚函数
};
void Base1::display() const {
	cout << "Base1::display()" << endl;
}

class Base2 : public Base1 {
public:
	virtual void display() const;
};
void Base2::display() const {
	cout << "Base2::display()" << endl;
}
class Derived : public Base2 {
public:
	virtual void display() const;
};
void Derived::display() const {
	cout << "Derived::display()" << endl;
}

void fun(Base1 *ptr) {
	ptr->display();
}

int main() {
	Base1 base1;
	Base2 base2;
	Derived derived;
	fun(&base1);
	fun(&base2);
	fun(&derived);
	return 0;
}

程序运行结果:

23cd48758c42faa95b75a8c8eea0664e.png

参考

  1. ^http://www.xuetangx.com/courses/course-v1:TsinghuaX+00740043_2x_2015_T2+sp/courseware/93f0d3a029d84059a84d02745a1e2bfd/62b1f428ccb14e7bafa80cc5be4519b6/
  2. ^https://zhuanlan.zhihu.com/p/103992675
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值