Ниже компиляций кода с gcc v4.3.3 и шаблонным дочерним классом, кажется, переопределяет виртуальную функцию в родителе, но разве который не нарушает правило, что у Вас не может быть виртуальной шаблонной функции? Или что-то еще происходит, который я не понимаю?
class BaseClass
{
public:
virtual void Func(int var)
{
std::cout<<"Base int "<<var<<std::endl;
}
virtual void Func(double var)
{
std::cout<<"Base double "<<var<<std::endl;
}
};
template <class TT>
class TemplateClass : public BaseClass
{
public:
using BaseClass::Func;
virtual void Func(TT var)
{
std::cout<<"Child TT "<<var<<std::endl;
}
};
int main(int argc, char **argv)
{
BaseClass a;
TemplateClass<int> b;
BaseClass *c = new TemplateClass<int>;
int intVar = 3;
double doubleVar = 5.5;
a.Func(intVar);
a.Func(doubleVar);
b.Func(intVar);
b.Func(doubleVar);
c->Func(intVar);
c->Func(doubleVar);
delete c;
}
Это затем выводы:
Основывайте интервал 3
Основа удваивается 5.5
Дочерний TT 3
Основа удваивается 5.5
Дочерний TT 3
Основа удваивается 5.5
как я надеялся, но я не уверен, почему это работает.
Шаблон класса может иметь виртуальные функции-члены.
Шаблон функции-члена не может быть виртуальным. То есть следующее недопустимо:
class C
{
public:
template <typename T>
virtual void f();
};
Кроме того, если производный класс имеет шаблон функции-члена с тем же именем, что и виртуальная функция в базовом классе, он не отменяет виртуальную функцию. Итак, если бы TemplateClass :: Func
был шаблоном функции-члена, например
template <typename T>
void Func(T var) { /* ... */ }
, он не переопределил бы BaseClass :: Func
.
Это не нарушает правило. Фактическое правило гласит 14.5.2/4:
Шаблон функции-члена не должен быть виртуальным. [Пример:
template
struct AA { template virtual void g(C); // error virtual void f(); // OK };