Пример 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 - это отдельный объект?
Это может быть вопросом толкования. * «... не известный вообще» * может означать *, известный в этом примере, но не в общем случае произвольного 'B * pb' * * –
@DrewDormann, можете ли вы привести мне пример того, что мы не знать во время компиляции? – Fihop
Да. 'void function (B * pb) {pb-> f(); } ' –