2010-09-10 3 views
2

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

template<typename K> struct Base 
{ 
    K foo() { return (K)0; } 
}; 

template<typename K> struct Extension 
: public Base<K> 
{ 
    K foo(int a) { return (K)a; } 
}; 

int main() 
{ 
    Extension<float> e; 
    e.foo(); 
    return 0; 
} 

Edit: Хорошо, я думал, что это происходит только с шаблонными классами ... Что идея дизайнерского решения, чтобы скрыть версию базового класса по своей перегруженной версии из класса ребенка? Я имею в виду, что обе функции в одном классе работают нормально.

ответ

3

Extension::foo скрывается Base::foo. Вы можете использовать с помощью delaration, чтобы вернуть его обратно:

template<typename K> struct Extension 
: public Base<K> 
{ 
    using Base<K>::foo; 
    K foo(int a) { return (K)a; } 
}; 

Пункт # 33 («Избегайте скрывая унаследованных имена») в Скотт Мейерс в «Эффективное использование C++» является об этой проблеме.

0

выглядит так: Base :: foo() является закрытым.

+0

Они являются структурами. Доступ по умолчанию для структуры является общедоступным. – Danvil

+0

ах да. -1 для себя. Что такое ошибка компилятора? –

1

Foo from Extension скрывает foo от Base.

Добавление предложения using в Extension разрешает ошибку компиляции.

template<typename K> struct Base 
{ 
    K foo(void) { return (K)0; } 
}; 

template<typename K> struct Extension 
: public Base<K> 
{ 
    using Base<K>::foo; 
    K foo(int a) { return (K)a; } 
}; 

int main() 
{ 
    Extension<float> e; 
    e.foo(); 
    e.foo(1); 
    return 0; 
} 
3

Либо добавить, используя декларацию как другие ответы показывают, или сделать вызов с помощью квалифицированного имени

e.Base<float>::foo(); 
Смежные вопросы