Рассмотрим два класса 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().
РЕДАКТИРОВАТЬ: несколько уточнений:
- Цель состоит в том, чтобы манипулировать
Cобъектами с помощьюAуказателей. - В настоящее время я использую простую функцию, которая просто вызывает
B::start(), мне было особенно интересно, действительно ли объявление использования может «переопределить» виртуальное, и если нет, то как это позволило сосуществовать обеим функциям. - Я мог бы опустить несколько вещей, таких как наследование
virtualдля простоты.
C c; c.start();должен позвонитьB::start(). - person zdf   schedule 23.01.2017void C::start() override { B::start(); }? - person zdf   schedule 23.01.2017CчерезA*. - person JBL   schedule 23.01.2017