【C++多态】 --- 多态问题抛出与virtual关键字

C++ 专栏收录该内容
50 篇文章 0 订阅

1. C++中多态的概念

C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。

2. C++多态问题抛出

下面看一个具体的例子:

#include <iostream>
#include <stdlib.h>

using namespace std;

class Animal
{
public:
	void speak(void)
	{
		cout << "动物在说话" << endl;
	}

};

class Cat :public Animal
{
public:
	void speak(void)
	{
		cout << "小猫在说话" << endl;
	}
};

void doSpeak(Animal &animal)
{
	animal.speak();
}

void doSpeak(Animal *animal)
{
	animal->speak();
}

void test01()
{
	Animal animal;
	Cat cat;

	doSpeak(animal);
	doSpeak(cat);

	Animal *animal_ = new Animal;
	Cat *cat_ = new Cat;

	doSpeak(animal_);
	doSpeak(cat_);

}

int main(void)
{
	test01();

	system("pause");
	return 0;
}

 运行结果如下:

这里运行的结果是:动物在说话。

在Animal类中void speak函数前加上virtual关键字,再次运行,运行结果是:小猫在说话。

分析为什么会出现这种情况:

1> 没有对speak函数加virtual关键字时,此时是静态多态,函数地址在编译阶段已经绑定

2> speak加了virtual关键字之后,此时是动态多态,函数地址在运行时确定

 

案例分析:

1> 从运行结果来看,无论是使用指针还是引用的形式,去调用speak函数,都是执行基类的speak函数,这个显然不符合多态概念

     就是说子类和父类在执行同一个消息时,并没有做出不同的反应

2> 如何解决这个问题?

对于需要重写的函数,在基类的函数前加virtual关键字

子类在重写父类的这个函数时,virtual关键字可加可不加,但是建议加上,这样别人看代码的时候一眼看去就知道这个函数是对父类函数进行重写的

  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值