以下输出正确的是( )
作者:互联网
class Base
{
public:
void virtual Func()
{
cout<<"Base"<<endl;
}
};
class Derived : public Base
{
public:
void virtual Func()
{
cout<<"Derived "<<endl;
}
};
int main ()
{
Base* pBase = new Base();
pBase ->Func();
Derived * pDerived = (Derived*)pBase;
pDerived->Func();
delete pBase;
pDerived = new Derived();
pBase = pDerived;
pBase->Func();
delete pDerived
return 0;
}
正确答案: B 你的答案: C (错误)
- Base Derived Base
- Base Base Derived
- Base Derived Derived
- Derived Base Derived
解析:
- 选B,13好理解,对于2,强制类型转换时会将Base类型的数据所在的内存按照Derived类型格式解析和转换。pDerived解析得到的是pBase的虚函数表,相当于pDerived的vtbl虚函数表指针指向了pBase的虚函数表,故得到Base;
但这种强制转换比较危险,当访问某虚函数时子类存在而父类不存在时,就可能导致运行时出现访问错误,程序崩溃,而此时编译是正常的,因为指针的虚函数表是动态链接的。 - 当函数为虚函数时,子类继承基类会完全覆盖基类虚函数,强制指针类型转换无法改变类内虚函数的函数体;
虚函数调用与指针类型无关,基类调用基类虚函数,子类调用子类虚函数;
若为普通函数,普通函数同名但未被覆盖,优先匹配与指针类型匹配的同名函数;
即base类型指针调用base内部函数;Derived类型指针调用Derived类内函数;
标签:输出,pBase,正确,以下,Derived,pDerived,Base,指针,函数 来源: https://blog.csdn.net/qq_45662588/article/details/121061196