Давайте рассмотрим два класса A
и B
со следующим интерфейсом:Переопределить общедоступную виртуальную функцию с частной базой?
class A {
public:
virtual void start() {} //default implementation does nothing
};
class B {
public:
void start() {/*do some stuff*/}
};
, а затем третий класс, который наследует от обоих, A
публично, поскольку он реализует этот «интерфейс», и B
в частном порядке, потому что это деталь реализации.
Однако в этой конкретной реализации start()
должен содержать только вызов B::start()
. Поэтому я подумал, что могу использовать ярлык и сделать следующее:
class C: public A, private B {
public:
using B::start;
};
и покончить с этим, но, по-видимому, он не работает. Таким образом, я получаю using
функция частной базы не работает, чтобы переопределить виртуальные. Исходя из этого, два вопроса:
- Есть ли способ сделать эту работу так, как я полагал, она, возможно, сработала?
- Зачем компилятор принимает этот код как действительный? Как я вижу, теперь есть две функции
start()
с одной и той же сигнатурой вC
, и все же компилятор выглядит нормально и только вызываетA::start()
.
EDIT: Несколько уточнения:
- Цель состоит в том, чтобы манипулировать
C
объектов черезA
указателей. - В настоящее время я использую простую функцию, которая просто вызывает
B::start()
. Мне было интересно узнать, может ли использование объявления действительно «переопределить» виртуальный, а если нет, то как это позволяло сосуществовать обе функции. - Возможно, я пропустил несколько вещей, таких как
virtual
наследование для простоты.
Это не ясно, что вы ожидали. 'C c; c.start(); 'должен вызывать' B :: start() '. – ZDF
Он работает здесь: http://ideone.com/e71lnB – Rama
@Rama Я думаю, что это больше о A * a = & c; а-> начать(); для вашего образца ideone – grek40