Да, вы можете, и на самом деле вам даже не нужно переопределять или использовать что-либо виртуальное.
class ABC {
public: // or this may be protected, no difference
void woof();
void moo();
};
class D : private ABC { // now woof and moo are private
public:
using ABC::woof; // using declaration to make woof public again
ABC::moo; // access declaration (deprecated) does the same
};
То же самое работает, если они тоже виртуальные. Или, как отмечали другие, поиск виртуальных функций игнорирует доступ, указанный реализующим классом; любой класс, к которому вы можете привести, может предоставить доступ во время компиляции.
С другой стороны, без специальных объявлений в D
интерфейс public
для ABC
действительно был бы недоступен через D
, потому что вы не смогли бы выполнить повышение до ABC
. И если бы woof
и moo
были virtual
, вы бы хотели сделать переопределения private
, чтобы скрыть их. Возможно, это лучше отвечает на вопрос.