В чем проблема с кодом ниже?
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;
}
Проблема в сокрытие имени. функция 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 падение конца функции, возвращающей значение, без возврата чего-либо является неопределенное поведение.
d.test();
не будет работать, так как ваш производный класс test(char)
скрывает все функции базового класса, не будет соответствующей функции для вызова, если вы сделаете выше.