当新建一个对象并将创建的对象的地址分配给它的基址 class 指针时,编译器会做什么
what does compiler do when new an object and assign the address of the created object to its base class pointer
示例 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
指向的 B
是 C
的一部分,因此编译器无法减去常量 delta(B)
.
为什么编译器在编译时不知道 pb
指向的 B
是 C
的一部分?根据我的理解,pb
指向的B
肯定是C
的一部分,因为我们new C
和C
继承自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
指向哪个子类型。它可以是 C
、D
或其他。如果你进入通话,你会知道 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);
}
示例 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
指向的 B
是 C
的一部分,因此编译器无法减去常量 delta(B)
.
为什么编译器在编译时不知道 pb
指向的 B
是 C
的一部分?根据我的理解,pb
指向的B
肯定是C
的一部分,因为我们new C
和C
继承自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
指向哪个子类型。它可以是 C
、D
或其他。如果你进入通话,你会知道 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);
}