0
点赞
收藏
分享

微信扫一扫

以下输出正确的是( )

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 (错误)

  1. Base Derived Base
  2. Base Base Derived
  3. Base Derived Derived
  4. Derived Base Derived

解析:

  1. 选B,13好理解,对于2,强制类型转换时会将Base类型的数据所在的内存按照Derived类型格式解析和转换。pDerived解析得到的是pBase的虚函数表,相当于pDerived的vtbl虚函数表指针指向了pBase的虚函数表,故得到Base;
    但这种强制转换比较危险,当访问某虚函数时子类存在而父类不存在时,就可能导致运行时出现访问错误,程序崩溃,而此时编译是正常的,因为指针的虚函数表是动态链接的。
  2. 当函数为虚函数时,子类继承基类会完全覆盖基类虚函数,强制指针类型转换无法改变类内虚函数的函数体;
    虚函数调用与指针类型无关,基类调用基类虚函数,子类调用子类虚函数;
    若为普通函数,普通函数同名但未被覆盖,优先匹配与指针类型匹配的同名函数;
    即base类型指针调用base内部函数;Derived类型指针调用Derived类内函数;


举报

相关推荐

0 条评论