Предупреждение связано с тем, что вы не можете вызвать derived::exception(const char*)
для объекта типа derived
(или через указатель на derived
), даже если родительский класс определяет его, и он является виртуальным (так что вы ожидал, что он будет доступен в derived
). Чтобы удалить предупреждение, вам нужно выставить эту функцию-член в derived
:
class derived : public intermediate
{
public:
virtual void exception(const char* msg) {intermediate::exception(msg);}
virtual void exception()
{
intermediate::exception("derived:unknown exception");
}
};
Или, если вы не хотите показывать это другим, объявите это как частное без определения.
class derived : public intermediate
{
public:
virtual void exception()
{
intermediate::exception("derived:unknown exception");
}
private:
void exception(const char* tmp);
};
ОБНОВЛЕНИЕ: После двойной проверки (и как указал Als) директивы using вы можете сделать это тоже:
class derived : public intermediate
{
public:
using intermediate::exception; // imports both declarations from intermediate
virtual void exception() // will not clash with the imported declaration of the
// same signature, but properly overriders the parent
// class's defition
{
intermediate::exception("derived:unknown exception");
}
};