2013-10-28 5 views
0

Если у меня есть перегруженная функция в базовом классе, почему мне нужно объявить пространство имен базового класса для всех перегруженных копий, которые я не повторно реализую (учитывая, что я повторно выполнил хотя бы один). Рассмотрим следующий код, например:Наследование перегруженных функций: требуется пространство имен?

#include <iostream> 


class Base { 
protected: 
    int bar; 

public: 
    Base() : bar(0) {} 
    virtual void Bar(int b) { bar = b; } 
    virtual int Bar() { return bar; } 
}; 

class Foo : public Base { 
protected: 
    int extraBar; 

public: 
    //virtual void Bar(int b) { extraBar = b; } //Uncomment 
}; 

int main() { 

    Foo T; 

    std::cout << T.Base::Bar() << std::endl; 
    std::cout << T.Bar() << std::endl; //will cause code to not compile 

    return 0; 
} 

Есть ли простой способ обойти его? Я бы изменить несколько строк кода вручную, так как я

func() 
func(var) 
func(var, var, var) 

и ВДП не то же самое, так что найти и заменить на FUNC (вар) не будет работать так хорошо.

+0

@Adam Что в небесах, ты говоришь? – Chemistpp

+0

Программы на C++ - это не скрипты. – Adam

+0

Эх, я скрипю некоторые, я кое-что кодирую, Уже поздно. – Chemistpp

ответ

3

Вы можете просто сделать это

using Base::Bar; 

в Foo классе. Компилятор не найдет Bar без аргументов, без using, так как он скрыт Foo::Bar функции.

Имя может быть скрыт явного объявления того же имени в гнездовой декларативной области или производный класса

+0

'using Base :: Bar;' исправлено. Мне любопытно, что «использование Base :: Bar;» не требовалось, если перегрузки не были переопределены. что заставляет меня думать, что я не очень разбираюсь в перегруженных операторах. 'Bar()' и 'Bar (var)', на мой взгляд, были двумя разными функциями, поэтому, когда он не находит 'Foo :: Bar()', я думал, что он должен по умолчанию, как обычно, в Base Base() '. Благодаря! – Chemistpp

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