仮想基本クラス
以前に学んだ継承のプロセスで、次のような状況を考えたことがあるでしょうか。多重継承関係で、派生クラスが 2 つの親クラスから継承し、これら 2 つの親クラスがたまたま 1 つの親クラスから継承した場合です。クラス。同じメンバーを2つ引き継ぐ可能性があるので、それは面倒です!
これはいわゆる曖昧性の問題につながります。勉強を始めましょう。
まず、この種の多重継承を説明する例を示します。私はそれについて考えて、次の例を思いつきました。ある裕福な家族には、最初は二人の息子がいて、その後、彼らは二人の息子を持ちました。数年後、彼らは成長し、男性のマスターは年をとったので、さらに2つの鍵を合わせて2人の息子にそれぞれ与え、彼らに家業を任せました。そして、家系を継ぐ孫がそれぞれ男の子と女の子がいました。いわゆる人々は豊かになり、その後成長し、鍵を渡す時が来ました。古代では、鍵は当然少年に渡されたので、当然、鍵は孫に渡されました。このとき、孫の父親と叔父(つまり、元の所有者の2人の息子)全員が孫に鍵を渡さなければならなかったので、孫は2つの鍵を持っていました。小さな孫は、手に持った2つの鍵を見て、「1つで十分だよ!2つ…無駄じゃない?」と言いました。
この物語を読むと、この物語の元の男性主人公であるおじいちゃんは基本クラスであり、その 2 人の子供は 2 つの派生クラスであり、そのうちの 1 人の子供が小さいクラスになります。孫子は 2 つの派生クラスを継承しているため、最後の派生クラスになります。そして、これら 2 つの派生クラスには共通のメンバー (キー、両方とも同じ基本クラス (おじいちゃん) を継承しているため) があります。孫子の最後の派生クラスには 2 つの重複したメンバー (キー) があり、これが曖昧さの原因です。
以下では、この例に従って具体的にコードを記述します。参照してください。
/************************************//デス: C++ チュートリアル デモ//作成者: Huang/ /著作権:www.dotcpp.com//日付:2017/12/18******************************** * *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){孫A ;//A.key=9;return0;}
このコードは、説明の便宜上、定義された 4 つのクラスが空であることを表現したものです。つまり、Grandson クラスは 2 つの親クラスを継承し、2 つのキー メンバーを持つことになります。この時点でこのキーを使用しようとすると、main 関数で値を割り当てようとするときにパブリック型として宣言されていることに注意してください。 、「一意ではない、曖昧です」というエラーメッセージが表示され、いわゆる曖昧性の問題が発生し、誰でもよく理解できます。
では、この問題を回避するにはどうすればよいでしょうか?これは、仮想基本クラスを使用する必要がある場合です。いわゆる仮想基底クラスは、継承するときにパブリック型を継承する前に、 virtualで変更することです。たとえば、この例では、親クラスは、派生クラスを継承するときに追加の virtual を追加するだけで済みます。 class と基底クラスは、基底クラス オブジェクトのコピーのみを維持します。複数のコピーや曖昧さを避けてください。
定義方法は、2 つの親クラスを派生するときに仮想宣言を追加することです。
クラス父1:仮想パブリック祖父クラス父2:仮想パブリック祖父
残りの部分は変更されません。自分のコンピュータでテストして、曖昧さの生成と仮想基本クラスの使用法を理解することができます。