多态是什么意思?有人理解同名不同意思,就像前一篇非多态中的例子,都是sayHello,
自己的对象自己sayHello当然可以不同意思了,我自己的函数自己说的算。即使像最后的
基类指针指向子类对象,通过基类指针访问同名函数的时候,由于基类指针访问的内存大小
就是基类的大小,子类对象创建的时候会先创建基类对象,所以相当于还是在自己的对象里
访问自己的实现。这是C语言里的概念。
OK,C++的多态则不是上面的意思,有人说了,我没法通过子类指针指向基类对象,这个我承认,
但是基类指针指向子类对象的时候,我能否访问子类的同名函数?也就是说我能否做到基类指针指向
基类对象的时候,访问的是基类对象的函数;当基类指针指向子类对象的时候,访问的是子类对象的函数。
这样我就可以通过一个基类指针指向对象的不同,获取不同的实现。
#include <iostream>
#include <cstdlib>
using namespace std;
class Father
{
public:
virtual void sayHello();
};
class Son: public Father
{
public:
void sayHello();
};
void Father::sayHello()
{
cout<<"Father say hello"<<endl;
}
void Son::sayHello()
{
cout<<"Son say hello"<<endl;
}
int main()
{
Father fatherIns;
Son sonIns;
Father *ptrFatherIns = &fatherIns;
Son *ptrSonIns = &sonIns;
Father &refFatherIns = fatherIns;
Father &refSon = sonIns;
/*1 自己的对象sayHello*/
ptrFatherIns->sayHello();
ptrSonIns->sayHello();
/*2基类指针指向子类对象,并且调用虚函数,会发生多态行为*/
cout<<"基类指针指向子类对象,并且调用虚函数"<<endl;
ptrFatherIns = &sonIns;
ptrFatherIns->sayHello();
/*3 子类指针不能访问
ptrSonIns = &fatherIns;
ptrSonIns->sayHello();
*/
/*4 基类引用子类对象,并且调用虚函数,会发生多态行为*/
cout<<"引用"<<endl;
refFatherIns.sayHello();
refSon.sayHello();
return 0;
}
如上是C++多态的一个例子,主要基类对象中加上关键字virtual,在程序中通过
指向基类对象的指针,或者基类对象的运用,同时调用虚函数时,根据对象的不同,才发生
运行时的多态现象。
在举个通俗的例子,人都会说你好,中国人说“你好”,英国人说“hello”,我只需要通过不同基类指针指向
中国人还是英国人,就产生了多态的效果。