Я прочитал много сообщений, и все говорят, что виртуальная таблица предназначена для каждого класса, а не для каждого объекта, а объект имеет только указатель _vtpr на общую vtable. Но, пожалуйста, рассмотрите этот пример:
class Base
{
public:
virtual void func1(void) {}
virtual void func2(void) {}
private:
int dummy;
};
class Der1 : public Base
{
public:
virtual void func1(void) {}
private:
int dummy;
};
class Der2 : public Base
{
public:
virtual void func2(void) {}
private:
int dummy;
};
int main(void)
{
Base * obj1 = new Der1;
Base * obj2 = new Der2;
}
Связаны ли obj1 и obj2 с этим уникальным базовым классом vtable? Я считаю, что ответ отрицательный, но не могли бы вы объяснить? И если оба эти объекта относятся к одной и той же vtable, как определяется, какие методы следует вызывать? Например, ссылка obj1-> func1 отличается от ссылки obj2-> func1.
ОБНОВЛЕНИЕ:
Какие операции выполняются при выполнении Base * obj1 = new Der1;
? Может кто-нибудь написать псевдокод для этих действий?
Der1
иDer2
есть своя собственная vtable, не так ли? - person Kerrek SB   schedule 10.04.2016