2017-12-12 10 views
0

pBaseからBase::g()にアクセスするにはどうすればよいですか?C++でオーバーライドされた親仮想メソッドにアクセス

#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; 
} 

出力された(そしてまだそれが下の場合と同様に "pBase->g();は" 仕事を得る):

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

また、Derived::f()Derived::g()とまったく同じですか? (すなわち。自動的にvirtualとして定義?)

+2

あなたのコード(あなたが示すように)は 'f'関数を呼び出さないので、主張された出力はコードと一致しません。 –

+0

が編集されました。ありがとう。 – nekonaute

答えて

6
  1. 使用pBase->Base::g();Basegの呼び出しを強制します。

  2. はい、Derived::fvirtualです。私は個人的には、virtualの再強調が悪い味であることを見つける。 C++ 11以降では、オーバーライドされた関数でoverride指定子を使用でき、virtualが基本クラスから削除された場合、コンパイラは診断を発行します。

+0

@Bathshebaだからシンプル!ありがとう!! – nekonaute

関連する問題