C++ виртуальное переопределение функционирует с тем же именем

У меня есть что-то как (упрощенный)

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; }
};

Спасибо!

20
задан Paused until further notice. 10 July 2010 в 16:44
поделиться

3 ответа

Здесь нельзя использовать полные имена. Если вы пишете void Function () {...} , вы переопределяете обе функции. Херб Саттер показывает , как ее можно решить .

Другой вариант - переименовать эти функции, потому что очевидно, что они делают что-то другое (в противном случае я не вижу проблемы переопределения обоих с одинаковым поведением).

31
ответ дан 30 November 2019 в 00:19
поделиться

В качестве обходного пути, попробуйте

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 {};
2
ответ дан 30 November 2019 в 00:19
поделиться

Если A и B - интерфейсы, то я бы использовал виртуальную деривацию, чтобы "соединить" их (сделать их перекрывающимися). Если вам нужны разные реализации для вашей Function при вызове через указатель на A или на B, то я бы настоятельно рекомендовал выбрать другой дизайн. В противном случае это будет больно.

Impl "происходит от" A и B означает, что Impl "является" A и B. Я полагаю, что вы не имеете в виду это.

Impl "реализует интерфейс" A и B означает Impl "ведет себя как" A и B. тогда тот же интерфейс должен означать то же поведение.

В обоих случаях иметь разное поведение в зависимости от типа используемого указателя было бы "шизофренией" и, конечно, ситуации, которую следует избегать.

-1
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: