访问在C ++中覆盖父虚方法

时间:2017-12-12 13:33:09

标签: c++ inheritance virtual

在以下代码中,如何从Base::g()访问pBase? (仍然得到" pBase->g();"按照下面的方式工作)

#include <iostream>
using namespace std;

class Base
{
    public:
    virtual void f(){ cout << "Base::f()" << endl; }
    virtual void g(){ cout << "Base::g()" << endl; }
    void h(){ cout << "Base::h()" << endl; }
};

class Derived : public Base
{
    public:
    void f(){ cout << "Derived::f()" << endl; }
    virtual void g(){ cout << "Derived::g()" << endl; }
    void h(){ cout << "Derived::h()" << endl; }
};

int main()
{
    Base *pBase = new Derived;
    pBase->f();
    pBase->g();
    pBase->h();

    Derived *pDerived = new Derived;
    pDerived->f();
    pDerived->g();
    pDerived->h(); 
    return 0;
}

输出是:

Derived::f()
Derived::g()
Base::h()
Derived::f()
Derived::g()
Derived::h()

此外,Derived::f()Derived::g()完全相同吗? (即自动定义为virtual?)

1 个答案:

答案 0 :(得分:6)

  1. 使用pBase->Base::g();强制调用g中的Base

  2. 是的,Derived::fvirtual。我个人觉得再次强调virtual的品味不佳。从C ++ 11开始,您可以在重写函数上使用override说明符,然后编译器在从基类中删除virtual时发出诊断信息。

相关问题