NoneVptr и vtable наследуются от базового класса?

Как можно заметить, D3 вводит новую виртуальную функцию, @function3()в середине цепи наследования. Мне интересно, что происходит с *- vptr и vtable, когда это происходит. D3 теперь является своего рода новым базовым классом,

class Base {
public:
    virtual void function1() { std::cout << "Base func1()\n"; };
    virtual void function2() { std::cout << "Base func2()\n"; };
};

class D1 : public Base {
public:
    virtual void function2() { std::cout << "D1 func2()\n"; };
};

class D2 : public D1 {
public:
    virtual void function1() { std::cout << "D2 func1()\n"; };
};

class D3 : public D2 {
public:
    virtual void function2() { std::cout << "D3 func2()\n"; };
    virtual void function3() { std::cout << "D3 func3()\n"; };
};

class D4 : public D3 {
public:
    virtual void function1() { std::cout << "D4 func1()\n"; };
    virtual void function3() { std::cout << "D4 func3()\n"; };
};

int main() {
    D3 d3;  
}

https://imgur.com/a/sxFzrKG

но когда я вижу записи vtable, то вижу function1(), function2(), Я думал, что записи должны быть function2(), function3(), Почему я не могу получить то, что думал?

2 ответа

Решение

Vtable содержит все унаследованные виртуальные функции и все недавно представленные.

Вот таблица для D3, сгенерированная MSVC:

const D3::`vftable' DD  FLAT:const D3::`RTTI Complete Object Locator'  ; D3::`vftable'
        DD      FLAT:virtual void D2::function1(void)
        DD      FLAT:virtual void D3::function2(void)
        DD      FLAT:virtual void D3::function3(void)

Причиной, по которой отладчик не показывает их все, может быть ошибка или ограничение.

Непонятно, что вы подразумеваете под "что происходит". Все vtables являются специфическими для класса (типа). vtable за D1 отличается от vtable для D2, и так далее.

Vtable для D3 имеет больше функций, чем D1 один. Вы можете обычно вызывать эти функции, если ваш статический тип D3 или же D4, но не может вызвать их, если ваш статический тип D1 или же D2,

Другие вопросы по тегам