質問
インタビューで、C ++のクラス宣言での仮想キーワードの使用法について尋ねられ、C ++のクラス宣言では仮想キーワードを使用できないと回答しました。インタビュアーはそれが可能であると言い、後でテストするように私に頼んだ。
自分で確認したので、これが可能であり、これがコンパイラエラーではないことがわかりました。実際、Visual C ++コンパイラでこのようなことをすると:
virtual class Test
{
int i;
};
コンパイラ警告" warning C4091: 'virtual':変数が宣言されていない場合、 'Test'の左側で無視されます"が表示されます。この警告が何を意味するのか、さらには仮想キーワードの使用が何であるのか、まだわかりません。有用な使用法がない場合、そもそもなぜこれが許可されているのか、なぜこれがコンパイラエラーではないのか。
解決
これはVC ++のバグです。 Comeauとgccはどちらもコードを拒否します。
他のヒント
virtual は、別のクラスから派生するときに使用できます:
class Foo : public virtual Bar
{
}
これは、複数の継承を使用するときに、同じ基本クラスの複数のバージョンを持つことを避けるために使用されます。 ウィキペディアには、このテーマに関する優れた記事があります。
クラスにvirtualを使用することはできません。メンバー関数でのみ機能します
あなたは間違った種類の使用法を見ています-インタビュアーが仮想ベースクラス宣言を参照していると確信しています:
class A : virtual public B, public C {
...
};
これは一般的なイディオムであり、「複数の基本クラス」を回避するために使用されます。ひし形の継承ツリーのシナリオ。それらの典型的な問題は、クラスBとクラスCの両方から継承し、それらが共通の祖先Aを共有することです。使用することになっています。 B& Cは、代わりに仮想ベースクラスとしてAを持ち、Aの同じインスタンスを参照します。これにより、この問題が解決します。
クラス図でより包括的な説明を見つけることができますこちら。
たぶん彼は仮想継承/仮想基底クラスについて言及していたのでしょうか?例:
class A : virtual public B
{ ... }
それは技術的にはクラス定義の一部になります。
クラス宣言で仮想基本クラスを使用することについて話していたのでしょうか?
これに似ています:
class CashierQueue : virtual public Queue {};
これは、同じ基本クラスを共有する2つ以上のクラスから継承するときに、派生クラスがメンバーデータの複数のコピーを持たないようにする場合に、多重継承で使用されます。
class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};
http://msdn.microsoft.comを参照してください。 /en-us/library/wcz57btd(VS.80).aspx