この質問は私の頭の周りに浮かぶ大きな疑問の1つであり、言葉で説明するのも難しいです。明白な場合もあれば、クラックするのが難しい場合もあるので、質問は次のようになります::
クラスベース{ 公衆: int a_number; ベース(){} virtual void function1(){} virtual void function2(){} void function3(){} }; class Derived:public Base { 公衆: Derived():Base(){} void function1(){cout<<"ベースから派生"<<endl; virtual void function4(){cout<<"派生のみ"<<endl;} }; int main(){ 派生*der_ptr= new Derived(); ベース*b_ptr= der_ptr; //アドレスだけが渡されているため、b_ptrは派生オブジェクトを指します b_ptr-> function4(); //コンパイルエラーが発生します!! b_ptr-> function1(); //Derivedクラスのオーバーライドされたメソッドを呼び出します 0を返します。 }
Q1。b_ptrは派生オブジェクトを指していますが、どのVTABLEにアクセスし、どのようにアクセスしますか?b_ptr-> function4()はコンパイルエラーを出します。または、b_ptrが派生VTABLEの基本クラスVTABLEのサイズまでしかアクセスできないということですか?
Q2。Derivedのメモリレイアウトは(Base、Derived)でなければならないので、BaseクラスのVTABLEもDerivedクラスのメモリレイアウトに含まれていますか?
Q3。基本クラスVtableのfunction1とfunction2は基本クラスの実装を指し、派生クラスのfunction2は基本クラスのfunction2を指しているので、基本クラスにVTABLEが本当に必要ですか?(これは私が今までに尋ねることができる最もばかげた質問かもしれませんが、それでも私は現在の状態でこれについて疑問があり、答えはQ1の答えに関連している必要があります:))
コメントしてください。
しばらくお待ちいただきますようお願いいたします。