0

派生クラスを基本クラス ポインターに割り当てるときに、基本クラスの関数しか呼び出せない理由の原則を理解しています。仮想テーブルの私の理解から、その理由は、基本クラスの仮想関数ポインターのみが仮想テーブルに配置されるため、それらのみを呼び出すことができるためですが、基本クラスのポインターが派生クラスを指している場合、派生クラスのコンストラクターが基本と呼ばれる場合です。クラスの仮想関数は、仮想テーブルのオーバーライドに置き換えられます。

ただし、私のポイントは、仮想基本クラスのメンバー関数の派生クラスのオーバーライドで使用される派生クラスに非仮想メンバー関数がある場合、問題が発生するかどうかです。

私の理論は、関数アクセスの問題が関数内でジャンプしないため、ポインターを新しい DerivedClass に割り当てることによって、すべての派生クラスにスペースを割り当てているため、ポインターを使用して仮想オーバーライドされた関数へのアクセスが許可されるため、存在しないはずです。 v-table に保持されている仮想関数に。それ以降のすべてのアクションは、派生クラス オブジェクトにいるかのように行われるため、必要な関数にジャンプできます。

これは正しいです?または、基本クラスのポインターをジャンプ参照として使用する関数のジャンプに問題がありますか (配列のように: *pointer + 2 for function)、それがメンバー関数の呼び出し方法ですか?

これが(私の意図ではありませんが)問題ではない場合、int引数を取る仮想関数を持つことは理論的に可能でしょうか。次に、渡された int に応じて特定の派生クラス関数を呼び出す仮想関数の派生クラス オーバーライド内の switch ステートメントにより、「基本クラスで定義された仮想関数のみを呼び出す」問題を回避できますか?

例えば。(コンストラクタ等を持たないスケルトンと宣言・定義の分離)

class A
{
   protected:
          virtual void AFunc() ; 

} ;     

class B : public A
{
   public:
          virtual void AFunc() { BSpecificFunc() ;} // doable?
   /* if thats the case why not:
          virtual void Sfunv(int temp)
           {
              switch(temp)
                   {
                     case 1 : BSpecificFunca() ; break;
                     case 2:  BSpecificFuncb() ; break;
                     etc.  
                    }
            }
       */
   private:
          void BSpecificFunc() ; 
          void BSpecificFunca() ;
          void BSpecificFuncb() ;
          void BSpecificFuncc() ;

} ;  


int main()
{
   A *pBaseClass = new B;

   pBaseClass->AFunc(); //Will there be any issues doing this?

}

現在は設計段階にあるため、これを素晴らしく理論的なものにしています。

4

2 に答える 2

1

あなたが呼び出しpBaseClass->AFunc()pBaseClass実際にはBthenB::AFunc()が呼び出されます。IfpBaseClassが実際にはAthenA::AFunc()が呼び出されます。それがポリモーフィズムの要点です。

B::AFunc()までです。他の関数を呼び出したり、に存在しないBデータを使用したりできない理由はありません。BA

于 2013-08-01T20:20:01.620 に答える
0

問題はありません。非仮想関数の呼び出しは既に解決されています。このように考えてください: のB::AFunc()ようなものにコンパイルされますcall BSpecificFunc。これはコンパイル時に実行できます。

唯一の課題は に到達することB::AFunc()であり、そのために仮想テーブルがあります。しかし、そこに到達すると、問題はなく、オブジェクト ポインターは実際にオブジェクトを指しBます (これは に対して有効でBSpecificFuncあり、への関数呼び出しBSpecificFunctionは既に解決されています。

于 2013-08-01T20:23:35.597 に答える