多重继承问题的基指针偏移量调整

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));

但转换是隐式的。