在以下代码中,如何从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
?)
答案 0 :(得分:6)
使用pBase->Base::g();
强制调用g
中的Base
。
是的,Derived::f
是virtual
。我个人觉得再次强调virtual
的品味不佳。从C ++ 11开始,您可以在重写函数上使用override
说明符,然后编译器在从基类中删除virtual
时发出诊断信息。