C++语言的多态性 与 C++类的虚函数有关
引入一个问题:定义一个基类指针,指向派生类对象,然后根据指针调用相应的方法,会有什么效果?
class CBase
{
public:
virtual void vfun()
{
cout<<"vfun from base class"<<endl;
}
void fun()
{
cout<<"fun from base class"<<endl;
}
};
class CDerive : public CBase
{
public:
virtual void vfun()
{
cout<<"vfun from derive class"<<endl;
}
void fun()
{
cout<<"fun from derive class"<<endl;
}
};
CBase* pBase;
CBase base;
CDerive derive;
【1】若 pBase = &derive;
pBase->vfun();
pBase->fun();
// 输出结果
vfun from derive class
fun from derive class
// 虚函数在派生类中得到重载 且 指针指向派生类对象
【2】若 pBase只是定义,但是没有进行初始化;
pBase->vfun();
pBase->fun();
// 会输出Base class 中的相应函数处理结果
// 若要基类指针调用派生类的函数方法,要么让pBase指向派生类对象,要么对pBase进行类型显示强制转换(CDerive*)pBase;
(CDerive*)pBase->vfun();
(CDerive*)pBase->fun();
对于每一个内部含有虚函数的类,编译器都会为其生成一个虚函数表(vtable),表中的每个元素都指向一个虚函数的地址,编译器还会生成一个成员变量-----虚函数表指针(vptr)指向虚函数表,这个会被继承的。。。。。