2012-05-04 11 views
1

を使用してください:dDerivedオブジェクトである場合は、このコードから始まって基本クラスの仮想メソッド

class Base{ 
public: 
    virtual void foo(){....} 
}; 
class Derived{ 
public: 
    void foo(){....} 
}; 

、私はいくつかの方法で、このオブジェクトの基本クラスで定義されたfooメソッドを呼び出すことができますか?

編集:私は外から意味、がベースに結合するように:: fooの()

+1

'Base :: foo()'を呼び出します。 –

+0

はい、忘れてしまいました。外部から。 – Aslan986

+1

@ Aslan986:あなたは本当にこれを行う必要がありますか?あなたは本当にこれをやる必要がありますか?多くの場合、コールに特定の*オーバーライド*を実行させるように強制することは非常に悪い考えです。あなたは望ましくない結果につながるかもしれません... –

答えて

6

呼び出しで明示的に指定します。

#include <iostream> 

class Base{ 
public: 
    virtual void foo(){ 
     std::cout << "Base" << std::endl; 
    } 
}; 
class Derived : public Base{ 
public: 
    void foo(){ 
     std::cout << "Derived" << std::endl; 

    } 
}; 

int main() 
{ 
    Derived d; 
    d.Base::foo(); 
    return 0; 
} 
+0

これは質問に答えて、正しいですが、私はまだあなたがこれをしなければならないと感じ、何かが間違っています。 –

+0

@JohnDibling私はちょうど他の答えを行って、同意する必要があります。間違ったことがありますが、私はそのようなものを必要とするレガシーコードの状況にあったので、アドバイスの言葉を省きました。そのような方法で関数を呼び出すことは、決して設計の一部であってはならない。 – pmr

3

外のコードからそれを呼び出すには、まだ明示的に呼び出しで名前を修飾することができます

#include <iostream> 
#include <vector> 

struct base { 
    virtual void do_something() { std::cout << "Base::do_something();\n"; } 
}; 

struct derived : public base { 
    virtual void do_something() { std::cout << "derived::do_something();\n"; } 
}; 

int main() { 

    derived d; 

    d.base::do_something(); 
    return 0; 
} 

あなたはオブジェクトへのポインタを使用している場合、あなたはd->base::do_something();にそれを変更したいです。

6

ジャスト(Derivedは実際にあなたのコードでは、それはないBaseから継承すると仮定すると)呼び出しを修飾:

​​

さて、これはなんとかですが、それはまた、非常に疑問です。メソッドが仮想の場合はオーバーライドされ、ユーザーは特定のオーバーライドを呼び出す必要はありませんが、ファイナライズオーバーライダーを呼び出す必要があります。そうしないと、すべての方法でクラス不変条件が破られる危険があります。

Derived::fooの実装が無効な状態でオブジェクトを残し、ユーザーが余分な作業が行われないだろうと不変が壊れているBase::fooを呼び出す場合、いくつかの不変保持するために必要ないくつかの余分な仕事をしたことを考えてみましょう。

+0

+1これは疑問のパラメータによれば正しいですが、混乱の可能性があるものに対処しているので、より効果的です。 –

関連する問題