私はBarがFooから継承するクラスFoo
とBar
を持っています。どちらのクラスもgetLength()
メソッドを持っています。私はスーパークラスFoo
オブジェクトをパラメータとして取る私のメインでは機能がありますが、多くの場合、Bar
オブジェクトが渡されます。サブクラスのメソッドを呼び出す
Bar
オブジェクトが渡されたとき、なぜまだFoo
getLength()
メソッドが呼び出されますか?
私はBarがFooから継承するクラスFoo
とBar
を持っています。どちらのクラスもgetLength()
メソッドを持っています。私はスーパークラスFoo
オブジェクトをパラメータとして取る私のメインでは機能がありますが、多くの場合、Bar
オブジェクトが渡されます。サブクラスのメソッドを呼び出す
Bar
オブジェクトが渡されたとき、なぜまだFoo
getLength()
メソッドが呼び出されますか?
申し訳ありませんが、これは愚かな質問ですが、両方のgetLength()関数を "仮想"としてマークしましたか?
親クラスのメソッドを 'virtual'としてマークするだけです。 – sje397
子クラスがそれを上書きできる場合は、メソッドをvirtual
として定義する必要があります。
virtual
を基本クラスに宣言する必要があります。
仮想メソッドを持つクラスには、仮想デストラクタも必要であることに注意してください。ここでの情報の
充実しています:http://www.parashift.com/c++-faq-lite/virtual-functions.html
あなたが仮想としてメソッドを宣言する必要があります。
class Foo
{
virtual double getLength();
}
もちろん、この機能にバーチャルとしてマークする必要があります。しかし、なぜこれが事実ですか?
C++では、非仮想関数呼び出しは、型の参照を使用してコンパイル時に解決されますが、オブジェクトの実際の型ではありません。したがって、あなたの場合、Foo :: getLength()関数が呼び出されて—という関数がFooを使用するように宣言されているのはこのためです。
しかし、関数を仮想として宣言すると、オブジェクトの実際の型によって呼び出される関数が決まります。
すべての詳細についてはvirtual functions section of the C++ FAQをお読みください。
(インスタンスメソッドはデフォルトで仮想あるJavaなどの言語にこのシナリオを比較してください。)
あなたは仮想としてはFooさんのgetLength()関数を宣言しなければなりません。バーチャルファンクション、仮想化、バーチャルテーブルなどを隠すためのリンクについては、下のリンクを参照してください。 [http://www.learncpp.com/cpp-tutorial/122-virtual-functions/]
もちろん、インタビューの質問は1つはconstと宣言されています。
getLength()の宣言に「virtual」キーワードが必要です。リソースを正しく解放するために、すべてのクラスに仮想デストラクタを作成することを覚えておいてください。派生クラスを指し示す基本クラスへのポインタを使用し、非仮想デストラクタを呼び出すと、基本クラスのデストラクタのみが呼び出されるためです。仮想デストラクタを追加すると、まず派生クラスのデストラクタが呼び出され、その後にデストラクタが呼び出されます。派生クラスで余分なリソースを取得し、最初に解放する必要がある場合に便利です。そして、基本クラスのデストラクタは余分なリソースについて知らなかったので、それを作ることができません。
あなたのFooクラスでgetLength()が 'virtual'宣言されていますか? – RageD
コードを投稿してください。 –
mainに渡されるオブジェクトのインスタンスを作成するコードだけでなく、 'main'メソッドコードを投稿できますか? – InSane