CAT *p;
...
p->speak();
...
В какой-то книге говорится, что компилятор переводит p- > speak() в:
(*p->vptr[i])(p); //i is the idx of speak in the vtbl
Мой вопрос: поскольку во время компиляции невозможно узнать реальный тип p, что означает, что невозможно знать, какие vptr или vtbl использовать. Итак, как компилятор генерирует правильный код?
[модифицировано]
Например:
void foo(CAT* c)
{
c->speak();
//if c point to SmallCat
// should translate to (*c->vptr[i])(p); //use vtbl at 0x1234
//if c point to CAT
// should translate to (*c->vptr[i])(p); //use vtbl at 0x5678
//since ps,pc all are CAT*, why does compiler can generate different code for them
//in compiler time?
}
...
CAT *ps,*pc;
ps = new SmallCat; //suppose SmallCat vtbl address is 0x1234;
pc = new CAT; //suppose CAT vtbl address is 0x5678;
...
foo(ps);
foo(pc)
...
Любые идеи? Спасибо.