虚継承と虚関数

1226 ワード

update:6/6、オブジェクト向けプログラム設計
かそうかんすう
1つのベースクラスでvirtualタイプ、すなわちvirtual void Run()として関数を宣言する.この関数は虚関数です
≪アクション|Actions|emdw≫:マルチステートを実装し、親タイプの別のポインタが子クラスのインスタンスを指し、親クラスのポインタで実際の子クラスのメンバー関数を呼び出します.
ここは
class vehicle{
public:
    int MaxSpeed;
    int Weight;
    virtual void Run(){
        cout<

次に、親ポインタを使用して子インスタンスを指します.
vehicle vc,*VC;
bicycle bc;
motorcar mc1;

VC=&vc;
VC->Run();

VC=&bc;
VC->Run();

VC=&mc1;
VC->Run();

結果は
NMSL1 NMSL2 NMSL3
Runを虚関数として宣言しなかった場合、結果は次のようになります.
NMSL1 NMSL1 NMSL1
          “    ”,                ,          。

 
ダミー継承
前述したように、虚関数はベースクラスで宣言され、虚継承は異なり、虚継承は世代のサブクラスで継承方式が虚継承であることを宣言します.
class bicycle:virtual public vehicle{
public:
    int Height;
    void Run(){
        cout<

虚継承の役割は次のとおりです.
ダミー継承は、オブジェクト向けプログラミングにおける技術であり、指定されたベースクラスを指し、継承アーキテクチャでは、そのメンバーデータインスタンスを、このベースタイプから直接または間接的に派生した他のクラスに共有する.
仮想継承は多重継承に特有の概念である.仮想ベースクラスは、多重継承を解決するために現れます.
クラスDはクラスB 1,B 2から継承され,クラスB 1,B 2はクラスAから継承されているが,B 1B 2がAを継承していることを説明しない方式を加えると,DがAの関数を呼び出す際に二義性が現れ,B 1がAを継承しているのかB 2がAを継承しているのか分からないため,虚継承を導入する必要がある.