2012-02-03 3 views
0
template <class T, class U, class Child> 
class Parent { 
public: 
    virtual T blah() { 
    return gaga; 
    } 
protected: 
    T gaga; 
}; 

class Child : public Parent<double, double, Child> { 
    virtual void blah(int overloaded) { 
    } 

    virtual void func() { 
    blah(); 
    } 
}; 

int main() { 
    Child* p = new Child(); 
} 

Почему код не указан? Почему я не могу перегрузить мою виртуальную функцию?Функция виртуального шаблона Перегрузка

Ошибки я получаю:

prog.cpp: In member function ‘virtual void Child::func()’: 
prog.cpp:16: error: no matching function for call to ‘Child::blah()’ 
prog.cpp:12: note: candidates are: virtual void Child::blah(int) 
prog.cpp: In function ‘int main()’: 
prog.cpp:21: warning: unused variable ‘p’ 

ответ

4

Метод void blah(int) в Child прячется в Parent унаследованный T blah(). Вы можете отобразить его, добавив строку

using Parent::blah; 

до Child. Если вы хотите иметь доступ к Parent::blah(), вы должны убедиться, что оператор using находится в разделе общего доступа. Таким образом, вы бы добавить

public: 
    using Parent::blah; 
private: 
    ... 

к вершине Child сделать Parent::blah() видна всем. Вы также можете явно ссылаться на метод базового класса с Parent::blah() вместо blah(). Дополнительная информация доступна here.

+0

Спасибо. Это устранило проблему, и я могу использовать ее внутри класса ... Однако я не могу использовать Parent :: blah() снаружи. Например: p-> blah(); – user988098

+1

Чтобы сделать это, вы должны поместить оператор 'using' в общедоступную область. Я обновил свой ответ. –

-1

У вас просто есть прототип для blah у ребенка. Для родителя это T blah(), а для ребенка - void blah(int), тогда как оно должно быть double blah() для правильной перегрузки виртуальной функции.

Кроме того, что у вас есть аргумент шаблона Child в родительском?

Смежные вопросы