2015-06-10 3 views
1

Пример 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++, Бьярне писал: О запись в C::f, указатель this должен указывать на начало объекта C (а не на часть B). Однако во время компиляции не известно, что B, на которое указывает pb, является частью C, поэтому компилятор не может вычитать константу delta(B).

Почему компилятор не знает, что B указал на pb является частью C во время компиляции? Основываясь на моем понимании, B, на который указывает pb, определенно входит в состав C, так как мы new C и C наследуем от B!

Что относительно B* pb = new B;? знает ли компилятор B, на который указывает pb - это отдельный объект?

+0

Это может быть вопросом толкования. * «... не известный вообще» * может означать *, известный в этом примере, но не в общем случае произвольного 'B * pb' * * –

+0

@DrewDormann, можете ли вы привести мне пример того, что мы не знать во время компиляции? – Fihop

+0

Да. 'void function (B * pb) {pb-> f(); } ' –

ответ

2

Давайте сделаем несколько незначительных изменений в код:

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

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

В вызове выше, нет никакого способа узнать, какой подтип Bbp указывает. Это может быть C, D или что-то еще. Если вы перейдете на вызов, вы узнаете, какой подтип Bbp указывает на.

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); 
} 
+0

Поэтому, передавая' pb1' или 'pb2' функции' foo', компилятор знает, ooh, ладно, это указатель 'B', ничего больше! Я прав? – Fihop

+0

@FihopZz, это правильно. –

+0

Sahu, у меня есть еще один вопрос, можете ли вы помочь мне взглянуть на него? http://stackoverflow.com/questions/30766982/virtual-method-table-for-multiple-inheritance – Fihop