Глава 16.4 Параметризованная виртуальность в шаблонах C ++ - Полное руководство , написанное Дэвидом Вандеворде и Николаем М. Йосуттисом, гласит:
C ++ позволяетМы можем напрямую параметризовать три вида сущностей через шаблоны: типы, константы («нетипы») и шаблоны.Однако косвенно это также позволяет нам параметризировать другие атрибуты, такие как виртуальность функции-члена.
В этой главе проиллюстрирован следующий код:
#include <iostream>
struct NotVirtual
{};
struct IsVirtual
{
virtual void func() {;}
};
//---------------------//
template<typename T>
struct Base : T
{
void func()
{ std::cout<< "Base::func()" <<std::endl; }
};
template<typename T>
struct Derived : Base<T>
{
void func()
{ std::cout<< "Derived::func()" <<std::endl; }
};
//---------------------//
int main()
{
Base<NotVirtual> *p1 = new Derived<NotVirtual>();
p1->func();
delete p1;
Base<IsVirtual> *p2 = new Derived<IsVirtual>();
p2->func();
delete p2;
}
Пример онлайн: https://rextester.com/OAGC66937
Я понимаю, как использовать такую технику, но, к сожалению, в книге нет подробностей о том, как это происходит.Я вижу, что Base
на самом деле является производным классом, унаследованным от параметра шаблона T
.
Вопросы:
- Что происходит в фоновом режиме во времяпараметризованная виртуальность?
- Что-то происходит в результирующей v_table?
- Как передается
virtual
из параметра шаблона?