多重继承问题的基指针偏移量调整
Base pointer offset adjustment for multiple inheritance question
我知道在这种情况下会发生基本偏移调整
class Mother {
public:
virtual void MotherMethod() {}
int mother_data;
};
class Father {
public:
virtual void FatherMethod() {}
int father_data;
};
class Child : public Mother, public Father {
public:
virtual void ChildMethod() {}
int child_data;
};
Father *f = new Child;
在编译过程中,这段代码等同于
Child *tmp = new Child;
Father *f = tmp ? tmp + sizeof(Mother) : 0;
我的问题是这个offset在编译阶段是怎么确定的?
例如,在下面的例子中
void fun(Father* f) {
// do something
}
我们不知道指针会接收到什么对象,如何判断编译时是否需要调整偏移量,需要调整多少偏移量。
希望有人能解答我的疑惑,万分感谢!
函数的调用者确切地知道所涉及的类型并进行必要的调整。
即
Child c;
fun(&c);
行为与
完全相同
Child c;
fun(static_cast<Father*>(&c));
但转换是隐式的。
我知道在这种情况下会发生基本偏移调整
class Mother {
public:
virtual void MotherMethod() {}
int mother_data;
};
class Father {
public:
virtual void FatherMethod() {}
int father_data;
};
class Child : public Mother, public Father {
public:
virtual void ChildMethod() {}
int child_data;
};
Father *f = new Child;
在编译过程中,这段代码等同于
Child *tmp = new Child;
Father *f = tmp ? tmp + sizeof(Mother) : 0;
我的问题是这个offset在编译阶段是怎么确定的? 例如,在下面的例子中
void fun(Father* f) {
// do something
}
我们不知道指针会接收到什么对象,如何判断编译时是否需要调整偏移量,需要调整多少偏移量。
希望有人能解答我的疑惑,万分感谢!
函数的调用者确切地知道所涉及的类型并进行必要的调整。
即
Child c;
fun(&c);
行为与
完全相同Child c;
fun(static_cast<Father*>(&c));
但转换是隐式的。