c++ - 当新建一个对象并将创建的对象的地址分配给它的基类指针时,编译器会做什么

标签 c++ multiple-inheritance virtual-functions

示例 3:(第 377 页)

class A {virtual void f();};
class B {virtual void f(); virtual void g();};
class C: A, B {void f();};
A* pa = new C;
B* pb = new C;
C* pc = new C;
pa->f();
pb->f();
pc->f();
pc->g()

(1) 在Multiple inheritance for C++ , Bjarne 写道: 在进入 C::f 时,this 指针必须指向 C 对象的开头(而不是B 部分)。但是,在编译时通常不知道 pb 指向的 BC 的一部分,因此编译器无法减去常量 delta(B)

为什么编译器在编译时不知道pb指向的BC的一部分?根据我的理解,pb 指向的 B 肯定是 C 的一部分,因为我们 new CC 继承自 B!

B* pb = new B; 呢?编译是否知道 pb 指向的 B 是一个独立对象?

最佳答案

让我们对您的代码做一些小改动:

struct A {virtual void f() {}};
struct B {virtual void f() {} virtual void g() {}};

void foo(B* bp)
{
   bp->f();
}

在上面的调用中,无法知道 B bp 指向哪个子类型。它可以是 CD 或其他。如果你进入调用,你就会知道 B bp 指向哪个子类型。

struct C : A, B {void f() {}};
struct D : B {void f() {}};

int main()
{
   B* pb1 = new C;
   B* pb2 = new D;

   foo(pb1);
   foo(pb2);
}

关于c++ - 当新建一个对象并将创建的对象的地址分配给它的基类指针时,编译器会做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30766496/

相关文章:

javascript hasOwnProperty

C++ 从基类中的非虚函数调用纯虚函数

c++ - 如果在 C++ 中的列表迭代中完成删除,则出现段错误

c++ - 标准布局类上的偏移量?

c++ - g++/Clang 中的另一个错误? [C++ 模板很有趣]

c++ - 使用相同的参数调用基类的 C++ 构造函数

objective-c - @interface 可以有多个类吗?

C++ - 是否可以在多重继承中检查派生类类型?

java - 关于java虚方法的问题

c++ - 为什么这段代码是 "not ambigious!"——虚函数