簡體   English   中英

新建對象並將對象的地址分配給其基類指針時,編譯器會做什么?

[英]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)在C ++的多重繼承中 ,Bjarne寫道:在進入C::fthis指針必須指向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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM