1

あるインタビューで、C++ のクラス宣言での virtual キーワードの使用法について尋ねられたので、C++ のクラス宣言では virtual キーワードを使用できないと答えました。インタビュアーは可能だと言って、後でテストするように頼んだ.

自分で確認したので、これは可能であり、これはコンパイラ エラーではないことがわかりました。実際、Visual C++ コンパイラで次のようなことをすると、次のようになります。

virtual class Test
{
   int i;
};

「警告 C4091: 'virtual' : 変数が宣言されていない場合、'Test' の左側で無視されます」というコンパイラ警告が表示されます。この警告が何を意味するのか、さらに仮想キーワードの使用法が何なのかはまだわかりません。有用な使用法がない場合、そもそもこれが許可されている理由と、これがコンパイラ エラーではない理由です。

4

6 に答える 6

6

virtualは、別のクラスから派生するときに使用できます。

class Foo : public virtual Bar
{
}

これは、多重継承を使用するときに、同じ基本クラスの複数のバージョンを持つことを避けるために使用されます。ウィキペディアには、この件に関する優れた記事があります。

于 2009-05-06T09:57:46.670 に答える
6

これは VC++ のバグです。Comeau と gcc はどちらもコードを拒否します。

于 2009-05-06T09:59:30.770 に答える
2

クラスに virtual を使用することはできません。メンバー関数でのみ機能します

于 2009-05-06T09:54:26.180 に答える
2

あなたは間違った種類の使用法を見ています-インタビュアーが次のように仮想基本クラス宣言を参照していたと確信しています:

  class A : virtual public B, public C {
    ...
  };

これは一般的なイディオムであり、ひし形の継承ツリーで「複数の基本クラス」シナリオを回避するために使用されます。それらの典型的な問題は、クラス B とクラス C の両方から継承し、それらが共通の祖先 A を共有していることです。継承ツリーを「上に」移動すると、「A」のどのインスタンスであるかというあいまいさにぶつかります。使用することになっています。B と C が代わりに仮想基底クラスとして A を持っている場合、それらは A の同じインスタンスを参照するため、この問題は解決します。

クラス ダイアグラムを使用した詳細な説明については、こちらを参照してください。

于 2009-05-06T09:58:23.423 に答える
1

たぶん、彼は仮想継承/仮想基本クラスについて言及していたのでしょうか? 例えば

class A : virtual public B
{ ... }

それは技術的にはクラス定義の一部になります。

于 2009-05-06T09:58:18.587 に答える