c++进阶十(虚函数)
原创
©著作权归作者所有:来自51CTO博客作者蒋程扬的部落格的原创作品,请联系作者获取转载授权,否则将追究法律责任
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++要访问哪个对象只取决于指针的类型,与哪个对象进行赋值无关
虽然这里传入的为不同对象的指针:
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;
}
这样就正常了
即虚函数,实现通过指针调用函数时,就不再为指针所指的类型了,而是指针所指的对象的类型