Безопасно ли, если шаблон содержит виртуальную функцию? - PullRequest
4 голосов
/ 01 ноября 2011

Раннее связывание для шаблона и позднее связывание для виртуальной функции.Поэтому безопасно ли, если шаблон содержит виртуальную функцию?

template<typename T> 
class base {
public:
    T data;
    virtual void fn(T t){}
};

Ответы [ 3 ]

9 голосов
/ 01 ноября 2011

Это полностью безопасно. После создания экземпляра шаблона класса он становится обычным классом, как и другие классы.

template<typename T> 
class base {
public:
    T data;
    virtual void fn(T t){}
};


class derived : base<int> {
public:
    virtual void fn(int t){} //override
};

base<int> *pBase = new derived();
pBase->fn(10); //calls derived::fn()

Я также хотел бы отметить, что хотя в шаблоне класса разрешена виртуальная функция, в классе не разрешен шаблон виртуальной функции (как показано ниже):

class A
{
   template<typename T>
   virtual void f(); //error: virtual function template is not allowed
};
1 голос
/ 01 ноября 2011

Да, это довольно безопасно. Вы бы использовали его, имея класс, производный от него:

class derived : public base<int> {
    virtual void fn(int) { std::cout << "derived"; }
};

Конечно, если он содержит какие-либо другие виртуальные функции (т. Е. Предназначен для использования в качестве базового класса), вы обычно хотите также сделать виртуальный dtor виртуальным.

0 голосов
/ 01 ноября 2011

Нет никаких проблем безопасности, связанных с функцией virtual внутри класса template.Это так же хорошо, как наличие функции virtual внутри обычного class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...