Явное переопределение

Компиляторы msft для C++ поддерживают явное переопределение (см. http://msdn.microsoft.com/en-us/library/ksek8777.aspx).

// could be declared __interface I1, making the public scope and pure virtual implied
// I use the more expressive form here for clarity
class I1
{
public:
  virtual void foo() = 0;
};

class I2
{
public:
  virtual void foo() = 0;
};

class C : public I1, public I2
{
public:
  virtual void I1::foo() { cout << "I1::foo\n"; }
  virtual void I2::foo() { cout << "I2::foo\n"; }
};

int main()
{
  C c;
  static_cast<I1*>(&c)->foo();
  static_cast<I2*>(&c)->foo();

  cin.get();
}

Но GCC не нравится это. Простой "явный переопределение" онлайн-поиска дает информацию о новом ключевом слове. override, Это не обязательно связано с тем, что я ищу. Поддерживается ли эта функция каким-либо другим способом в C++11 (согласно спецификации) или, по крайней мере, в gcc?

Примечание. Приемлемым ответом может быть хакерство, если оно соответствует духу вопроса, а не новому дизайну для решения другой проблемы.

1 ответ

Решение

Я считаю, что единственный путь - через промежуточные классы, которые реализуют функциональность:

class Impl1 : public I1 {
public:
    void foo() { cout << "I1::foo\n"; }
};

class Impl2 : public I2 {
public:
    void foo() { cout << "I2::foo\n"; }
};

class C : public Impl1, public Impl2
{
};

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

Кстати, указатели не нужны; Вы можете использовать ссылки:

int main()
{
    C c;
    static_cast<I1&>(c).foo();
    static_cast<I2&>(c).foo();
}

(Или используйте явную квалификацию, которая полностью исключает виртуальную отправку:)

c.Impl1::foo();
c.Impl2::foo();
Другие вопросы по тегам