У меня есть что-то как (упрощенный)
class A
{
public:
virtual void Function () = 0;
};
class B
{
public:
virtual void Function () = 0;
};
class Impl : public A , public B
{
public:
????
};
Как я могу реализовать Функцию () для A и Функции () для B? Visual C++ позволяет Вам только определить определенную встроенную функцию (т.е. не в cpp файле), но я предполагаю, что это - расширение. GCC жалуется на это. Существует ли стандартный C++ способ сказать компилятор, которые функционируют, я хочу переопределить?
(Visual C++ 2008)
class Impl : public A , public B
{
public:
void A::Function () { cout << "A::Function" << endl; }
void B::Function () { cout << "B::Function" << endl; }
};
Спасибо!
Здесь нельзя использовать полные имена. Если вы пишете void Function () {...}
, вы переопределяете обе функции. Херб Саттер показывает , как ее можно решить .
Другой вариант - переименовать эти функции, потому что очевидно, что они делают что-то другое (в противном случае я не вижу проблемы переопределения обоих с одинаковым поведением).
В качестве обходного пути, попробуйте
struct Impl_A : A
{
void Function () { cout << "A::Function" << endl; }
};
struct Impl_B : B
{
void Function () { cout << "B::function" << endl; }
};
struct Impl : Impl_A, Impl_B {};
Если A и B - интерфейсы, то я бы использовал виртуальную деривацию, чтобы "соединить" их (сделать их перекрывающимися). Если вам нужны разные реализации для вашей Function
при вызове через указатель на A
или на B
, то я бы настоятельно рекомендовал выбрать другой дизайн. В противном случае это будет больно.
Impl
"происходит от" A
и B
означает, что Impl
"является" A
и B
. Я полагаю, что вы не имеете в виду это.
Impl
"реализует интерфейс" A
и B
означает Impl
"ведет себя как" A
и B
. тогда тот же интерфейс должен означать то же поведение.
В обоих случаях иметь разное поведение в зависимости от типа используемого указателя было бы "шизофренией" и, конечно, ситуации, которую следует избегать.