25

我有类似的东西(简化)

class A
{
  public:
    virtual void Function () = 0;
};

class B
{
  public:
    virtual void Function () = 0;
};

class Impl : public A , public B
{
  public:
        ????
};

如何实现 A 的 Function () 和 B 的 Function() ?Visual C++ 只允许您定义特定的内联函数(即不在cpp 文件中),但我想它是一个扩展。GCC 对此抱怨。有没有标准的 C++ 方法来告诉编译器我要覆盖哪个函数?

(视觉 C++ 2008)

class Impl : public A , public B
{
  public:
     void A::Function () {  cout << "A::Function" << endl; }
     void B::Function () {  cout << "B::Function" << endl; }
};

谢谢!

4

4 回答 4

34

您不能在那里使用限定名称。我你写void Function() { ... }你正在覆盖这两个函数。Herb Sutter 展示了如何解决它

另一种选择是重命名这些函数,因为它们显然做了不同的事情(否则我看不到以相同行为覆盖两者的问题)。

于 2010-06-30T14:42:13.650 回答
4

我可以建议另一种方法来解决这个问题。Typed您可以通过添加虚拟参数来添加更改Function签名的包装器。因此,您可以区分实现中的方法。

class A {
public:
  virtual void Function() = 0;
  virtual ~A() = default;
};

class B {
public:
  virtual void Function() = 0;
  virtual ~B() = default;
};

template<typename T>
class Typed : public T {
public:
  virtual void Function(T* dummy) = 0;
  void Function() override {
    Function(nullptr);
  }
};

class Impl : public Typed<A>, public Typed<B> {
public:
  void Function(A* dummy) override {
    std::cerr << "implements A::Function()" << std::endl;
  }
  void Function(B* dummy) override {
    std::cerr << "implements B::Function()" << std::endl;
  }
};

这种解决方案的好处是所有实现都放在一个类中。

于 2013-10-29T15:20:53.020 回答
2

作为一种解决方法,请尝试

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 {};
于 2010-06-30T14:45:09.353 回答
-1

如果 A 和 B 是接口,那么我将使用虚拟派生来“加入”它们(使它们重叠)。Function如果您需要通过指向A或指向的指针调用 if 的不同实现,B那么我强烈建议您选择另一种设计。否则会很痛。

Impl“派生自” AB意思是Impl“是”AB。我想你不是这个意思。

Impl“实现接口”AB意思是Impl“表现得像”AB. 那么相同的界面应该意味着相同的行为。

在这两种情况下,根据所使用的指针类型具有不同的行为将是“精神分裂症”,并且肯定是要避免的情况。

于 2010-06-30T14:44:48.717 回答