C++复习之路十三——虚函数和多态

一、C++三种特性

封装:打破了C语言函数的概念,可以将实现细节隐藏起来,使得代码模块化

继承:使得代码能够重用,提高了编程效率

多态:接口重用,在以后写代码的时候,大框架不需要改变,就能够使用之后写的代码。

二、多态的具体实现

要实现多态就必须先得有继承。我们先来看一个例子。

class Parent
{
public:
	 void print()
	{
		cout << "打印Parent的成员" << endl;
	}
};

class Son : public Parent
{
public:
	 void print()
	{
		cout << "打印Son的成员" << endl;
	}
};

我们定义了一个Parent类,这个类只有一个public的成员函数,Son类以pubic的方式继承Parent类,所以它也继承了print()函数。如果我们声明一个Son类的对象,并且让这个对象使用它的成员函数print()函数,打印出的结果为

打印Son的成员

这是因为这里出现了函数重写,将父类里面的print()函数在子类里面重新写了一遍。所以子类的对象会调用其本身的成员函数。

【注意】:函数重写必须出现在父类和子类中,且函数声明必须相同

现在我们定义一个父类对象的指针,让其指向子类的对象,会出现什么效果呢。

Parent *p = new Son;

这样打印出来的结果是:

打印Parent的成员

但是我们希望用父类的指针指向子类的对象,并且能够执行子类的print()函数。这个时候我们就要用到c++的一大特性——多态。

我么要实现多态,只要在父类的print()函数的返回类型前面加上virtual关键字就行了,这样我们就能够打印出我们所希望的结果了。子类的print(),函数前面可以加也可以不加。加上virtual就表示这是一个虚函数。

建议:我们在用多态的时候,我们最好在子类的相应的成员函数前也加上virtual这样就能让阅读代码的人清楚的知道这个函数的作用。

我们可以这样声明Parent类:

class Parent
{
public:
	virtual void print()
	{
		cout << "打印Parent的成员" << endl;
	}
};

然后我们用Parent对象的指针指向Son类的对象,然后执行print()函数就可以打印子类中的数据了。这样就形成了多态,多态能够让我们使用未来的代码,而且还不用改变现在的框架。比如我们再从Parent类继承一个Girl类

class Girl : public Parent
{
public:
	virtual void print()
	{
		cout << "打印girl的成员" << endl;
	}
};

然后我们将Parent的对象的指针指向Girl对象,我们也可以打印“打印girl的成员",而且我们不需要改变大框架。

从上面的例子我们可以看出c++为我们提供了很多的便利,在使用多态的时候,我们可以根据不同的对象来执行一些不同的任务,并且可以很好的兼容以后的代码。

三、总结形成多态的条件

1、必须有继承

2、必须有函数的重写,即父类和子类的函数原型相同。

3、必须是通过父类的指针指向子类,或者用父类去引用子类。

猜你喜欢

转载自blog.csdn.net/y____xiang/article/details/80098137