2012-03-10 9 views
0

私は別のクラス(A)を継承するクラス(B)を持っています。私はオーバーライドされたクラスAから関数を呼び出したい。私はまた、ベースを継承したものをクラスの独立した上書き関数を呼び出すことができるようにしたい(私は関数のCのバージョンを呼び出したいclass C : public Aを、と言う。)基本クラスの関数からオーバーロードされた関数を呼び出すにはどうすればよいですか?

は、ここでは一例

class A { 

public: 
    void callF(); 
    virtual void f() {}; 
}; 

class B : public A { 

public: 
    void f(); 
}; 

void A::callF() 
{ 
    //FYI, I want to be able to call this without knowing what the super class is. 
    f(); 
} 

void B::f() 
{ 
    std::cout << "I want this function to be called, but instead the default f() is called."; 
} 

編集です: 私の実際のコードでは、私はstd::vector<A> aVector;を持っています。それから私はaVector.push_back(B());と呼ぶでしょう。 aVector[0].callF();を呼び出した場合、デフォルトのa::f()が呼び出されます。 下記のように、私はスライスに問題があります。

+0

質問を少し明確にしてください。オーバーライドされた関数f()がベースクラスから呼び出されたときに呼び出すことができるようにしたいとします。上記の例では、クラスAでf()を呼び出すと、Bのオーバーライドされた関数を呼び出す必要があります。そうですか? – Gangadhar

+0

そうです。 また、Aクラスを継承するクラスCを実装したとします。 c.callF() 'を呼び出すと、Cのバージョンのf()を呼び出すことができます。 – sFuller

+0

そしてあなたは... –

答えて

1

あなたの建設:

vector_of_A.push_back(B()); 

はベクトルでBを格納しません。それはBを構築し、それからAを構築し、そのAをベクターに格納します。その結果、あなたはスライスを経験します。あなたのコードが正しい

https://stackoverflow.com/a/4403759/8747

0

あなたのコードは、この小さなテストプログラムで私の作品:

int main() 
{ 
    // Instantiate B, and reference it via a base class pointer. 
    A* b = new B; 

    b->callF(); 
    delete b; 
} 

出力:基底クラスのメンバ関数内の仮想メンバ関数を呼び出すとき

I want this function to be called, but instead the default f() is called. 

、その派生メンバ関数ですが呼び出されます。

+0

@sFuller http://sscce.orgを読んでください。特に、「投稿したコードが問題を表示していることを確認してください! –

+0

ああ、あなたの問題は一般的な問題で、**スライシング**と呼ばれています。私は速い忍者のスキルを持っていないので、他の回答者ができるだけ早くあなたの問題を説明すると確信しています。あなたの質問を編集し、私の答えにここに投稿したコメントを貼り付けてください。 –

1

は、詳細はこれを参照してください。

Aのコンストラクタからf()またはcallF()を呼び出しているため、あなたが観察した動作が得られる可能性があります。A :: f()がBの代わりに呼び出される:: f()。

関連する問題