2011-02-01 16 views
1

私はBarがFooから継承するクラスFooBarを持っています。どちらのクラスもgetLength()メソッドを持っています。私はスーパークラスFooオブジェクトをパラメータとして取る私のメインでは機能がありますが、多くの場合、Barオブジェクトが渡されます。サブクラスのメソッドを呼び出す

Barオブジェクトが渡されたとき、なぜまだFoogetLength()メソッドが呼び出されますか?

+1

あなたのFooクラスでgetLength()が 'virtual'宣言されていますか? – RageD

+1

コードを投稿してください。 –

+1

mainに渡されるオブジェクトのインスタンスを作成するコードだけでなく、 'main'メソッドコードを投稿できますか? – InSane

答えて

3

申し訳ありませんが、これは愚かな質問ですが、両方のgetLength()関数を "仮想"としてマークしましたか?

+2

親クラスのメソッドを 'virtual'としてマークするだけです。 – sje397

3

子クラスがそれを上書きできる場合は、メソッドをvirtualとして定義する必要があります。

1

あなたが仮想としてメソッドを宣言する必要があります。

class Foo 
    { 
     virtual double getLength(); 
    } 
1

もちろん、この機能にバーチャルとしてマークする必要があります。しかし、なぜこれが事実ですか?

C++では、非仮想関数呼び出しは、型の参照を使用してコンパイル時に解決されますが、オブジェクトの実際の型ではありません。したがって、あなたの場合、Foo :: getLength()関数が呼び出されて—という関数がFooを使用するように宣言されているのはこのためです。

しかし、関数を仮想として宣言すると、オブジェクトの実際の型によって呼び出される関数が決まります。

すべての詳細についてはvirtual functions section of the C++ FAQをお読みください。

(インスタンスメソッドはデフォルトで仮想あるJavaなどの言語にこのシナリオを比較してください。)

0

あなたは仮想としてはFooさんのgetLength()関数を宣言しなければなりません。バーチャルファンクション、仮想化、バーチャルテーブルなどを隠すためのリンクについては、下のリンクを参照してください。 [http://www.learncpp.com/cpp-tutorial/122-virtual-functions/]

0

もちろん、インタビューの質問は1つはconstと宣言されています。

0

getLength()の宣言に「virtual」キーワードが必要です。リソースを正しく解放するために、すべてのクラスに仮想デストラクタを作成することを覚えておいてください。派生クラスを指し示す基本クラスへのポインタを使用し、非仮想デストラクタを呼び出すと、基本クラスのデストラクタのみが呼び出されるためです。仮想デストラクタを追加すると、まず派生クラスのデストラクタが呼び出され、その後にデストラクタが呼び出されます。派生クラスで余分なリソースを取得し、最初に解放する必要がある場合に便利です。そして、基本クラスのデストラクタは余分なリソースについて知らなかったので、それを作ることができません。

関連する問題