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 中以某种方式支持此功能?

注意:可接受的答案可能是一个 hack - 只要它与问题的精神相同,而不是解决不同问题的新设计。

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 回答