2013-06-10 2 views
1

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

class B 
{ 
public: 
    int test() 
    { 
     cout<<"B:test()"<<endl; 
     return 0; 
    } 
    int test(int i) 
    { 
     cout<<"B test(int i)"<<endl; 
     return 0; 
    } 
}; 

class D: public B 
{ 
public: 

    int test(char x) { cout<<"D test"<<endl; return 0; } 
}; 

int main() 
{ 
    D d; 
    d.test(); 
    return 0; 
} 
+0

Вам действительно нужно сделать это в реальном коде? –

ответ

4

Проблема в имя скрывается. Функция test() в производном классе Dкожевенного перегруженных test() в базовом классе B, так что те не будут рассматриваться перегруженными в выражении:

d.test() 

Просто добавьте using объявления:

class D: public B 
{ 
public: 
    using B::test; 
// ^^^^^^^^^^^^^^ 
    int test(char x) { cout<<"D test"<<endl;} 
}; 

Также обратите внимание, что ваши перегрузки test() в базовом классе B должны возвращать int, но они ничего не возвращают.

В соответствии с пунктом 6.6.3/2 стандарта C++ 11, сбрасывая конец возвращающей значение функции без возврата неопределенное поведение.

+0

'B :: test': должно возвращать значение – RDX

+0

@PowerPC: О, правильно! Я пропустил это, спасибо. Переход к редактированию –

2
d.test(); 

не будет работать, так как производный класс test(char) скрывает все функции базового класса, не будет никакой функции согласования, чтобы позвонить, если вы выше.