Функция в производном классе с тем же именем, что и функции в базовом классе, скрывает функции в базовом классе.
Таким образом, вам нужно использовать квалифицированное имя для доступа к скрытой функции в базовом классе. .
Например, относительно вашего кода вы можете написать, например,
void public_function(void)
{
cout << "I'm a public function of ParentClass..." << endl;
protected_funtion();
SuperParentClass::protected_funtion();
}
Если функции с одинаковыми именами различаются по своим типам (в противном случае может возникнуть неоднозначность), тогда вы можете использоватьиспользование объявлений в производном классе для представления объявлений функций в базовом классе. Например,
#include <iostream>
struct A
{
void f() const
{
std::cout << "A::f()\n";
}
};
struct B : A
{
using A::f;
void f()
{
std::cout << "B::f()\n";
}
void test()
{
f();
const_cast<const B *>( this )->f();
}
};
int main()
{
B().test();
return 0;
}
Вывод программы:
B::f()
A::f()
Здесь без объявления использования в классе B функция f, объявленная в родительском классе A, скрывается объявлением функции сто же имя в производном классе B.
Объявление using позволяет сделать видимой функцию f, объявленную в классе A в области видимости производного класса B.