其他分享
首页 > 其他分享> > 以下输出正确的是( )

以下输出正确的是( )

作者:互联网

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类内函数;

标签:输出,pBase,正确,以下,Derived,pDerived,Base,指针,函数
来源: https://blog.csdn.net/qq_45662588/article/details/121061196