2

C ++用のmsftコンパイラは、明示的なオーバーライドをサポートしています(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で何らかの方法でサポートされていますか?

注:受け入れ可能な答えはハックである可能性があります-それが質問の同じ精神にあり、別の問題を解決するための新しい設計ではない限り。

4

1 に答える 1

3

唯一の方法は、機能を実装する中間クラスを経由することだと思います。

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();
于 2012-04-26T19:26:32.483 に答える