これは以前の多くの質問と似ていますが、回答を見つけることができなかったことを尋ねます。 BASE2の派生の具体的複数の継承の場合にvptrを選択する
#include <iostream>
using namespace std;
class Base1 {
public:
int b1_data;
virtual void b1_fn() {cout << "I am b1\n";}
};
class Base2 {
public:
int b2_data;
virtual void b2_fn() {cout << "I am b2\n";}
};
class Derived : public Base1, public Base2 {
public:
int d_data;
void b1_fn() {cout << "I am b1 of d\n";}
void b2_fn() {cout << "I am b2 of d\n";}
};
int main() {
Derived *d = new Derived();
Base1 *b1 = d;
/*My observation mentioned below is implementation dependant, for learning,
I assume, there is vtable for each class containing virtual function and in
case of multiple inheritance, there are multiple vtables based on number of
base classes(hence that many vptr in derived object mem layout)*/
b1->b1_fn(); // invokes b1_fn of Derived because d points to
// start of d's memory layout and hence finds vtpr to
// Derived vtable for Base1(this is understood)
Base2 *b2 = d;
b2->b2_fn(); // invokes b2_fn of Derived but how? I know that it "somehow"
// gets the offset added to d to point to corresponding Base2
// type layout(which has vptr pointing to Derived vtable for
// Base2) present in d's memory layout.
return 0;
}
、どのようB2点)(b2_fnしてもらうためにvtableのためvptrするのでしょうか?私はgccからmemlayoutダンプを見てみましたが、それほど分かりませんでした。
あなたの質問は、「GCCは複数の継承を持つ仮想関数をどのように実装していますか」です。 –
はい、種類は限られていますが、複数の基底クラスがあり、すべてが同じオフセットで派生オブジェクトレイアウトにマップされていない場合、バインディングをどのように実行するのかを知りたいと思います。基本的に、この "オフセット"のソースは私が探しているものです。 –