1,什么是虚函数:
在类里面使用vatrual修饰得函数称为虚函数

2,先看下面一个例子:
声明三个个类,其中child1,child2继承于base,并且存在相同的函数disp
并且要实现display分别打印各个类的disp

#include <iostream>
using namespace std;

class base
{
public:
void disp()
{
cout<<"我是base的函数"<<endl;
}

};
class child1:public base
{
public:
void disp() //出现与基类相同的函数,基类函数被隐藏
{
cout<<"我是child1的函数"<<endl;
}
};
class child2:public base
{
public:
void disp() //出现与基类相同的函数,基类函数被隐藏
{
cout<<"我是child2的函数"<<endl;
}
};
//显示各个类的disp函数
void display(base *b)
{
b->disp();
}

int main()
{
base b;
child1 c1;
child2 c2;
display(&b);
display(&c1);
display(&c2);
return 0;
}

正常情况下,因为dispaly传入不同对象的指针,调用disp函数应该是每个类的diap才对,但是发现上面一段程序运行的结果是:

c++进阶十(虚函数)_ios

这是因为c++要访问哪个对象只取决于指针的类型,与哪个对象进行赋值无关
虽然这里传入的为不同对象的指针:
display(&b);
display(&c1);
display(&c2);但是接收的是base*
所以调用的还是base的disp()函数

这里为了实现这个功能该怎么办呢?
3,将基类的disp函数加上virtual关键字:

#include <iostream>
using namespace std;

class base
{
public:
virtual void disp()
{
cout<<"我是base的函数"<<endl;
}

};
class child1:public base
{
public:
void disp() //出现与基类相同的函数,基类函数被隐藏
{
cout<<"我是child1的函数"<<endl;
}
};
class child2:public base
{
public:
void disp() //出现与基类相同的函数,基类函数被隐藏
{
cout<<"我是child2的函数"<<endl;
}
};
//显示各个类的disp函数
void display(base *b)
{
b->disp();
}

int main()
{
base b;
child1 c1;
child2 c2;
display(&b);
display(&c1);
display(&c2);
return 0;
}

这样就正常了

c++进阶十(虚函数)_类函数_02


即虚函数,实现通过指针调用函数时,就不再为指针所指的类型了,而是指针所指的对象的类型