C++ 虚函数是为实现多态而设计的。
多态最核心的概念就是可以通过父类指针指向子类对象。
多态最大的特点就是接口复用,即一个接口实现多种用途。
要想实现多态,子类必须重载父类中的函数,否则就不是多态。例如某个函数只有子类中有定义,此时仍然使用父类指针调用该函数会报错
先用简单的例子说明
class base {
public:
base(){};
virtual ~base(){};
public:
virtual void show()
{
printf("i am base
");
}
};
class sub : public base {
public:
sub(){};
virtual ~sub(){};
public:
void show()
{
printf("i am sub
");
}
};
class sub2 : public base {
public:
sub2(){};
virtual ~sub2(){};
public:
void show()
{
printf("i am sub2
");
}
};
#include <stdio.h>
#include "main.h"
void callFunc(base *ptr)
{
ptr->show();
}
int main()
{
base *ptr = new base();
sub *subPtr = new sub();
sub2 *subPtr2 = new sub2();
callFunc(ptr);
callFunc(subPtr);
callFunc(subPtr2);
return 0;
}
上述代码,sub/sub2继承base,函数show为虚函数。
函数callFunc通过父类指针ptr调用参数的show函数,由于输入的参数分别是base/sub/sub2的对象,所以上述程序的输出是:
i am base
i am sub
i am sub2
即通过一个接口,分别分别调到了不同对象的函数
如果没有虚函数机制,要想实现上述同样的功能,需要实现三个callFunc函数
void callFunc1(base *ptr)
void callFunc2(sub *ptr)
void callFunc3(sub2 *ptr)
所以这就是多态的机制,即一个接口实现多种形态。
以上只是自己的简单理解,其实多态远不止上述功能,其他自己还没有理解到,有理解有误的地方还请大家批评指正。