具有相同名称的C ++虚拟覆盖函数

时间:2010-06-30 14:39:08

标签: c++ virtual override diamond-problem

我有类似的东西(简化)

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文件中), 但我想这是一个扩展。海湾合作委员会抱怨这一点。 是否有标准的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; }
};

谢谢!

4 个答案:

答案 0 :(得分:31)

您不能在那里使用限定名称。我写void Function() { ... }你正在覆盖两个函数。 Herb Sutter显示how it can be solved

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

答案 1 :(得分: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 {};

答案 2 :(得分:2)

我可以建议另一种解决此问题的方法。您可以通过添加伪参数来添加更改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;
  }
};

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

答案 3 :(得分:-1)

如果A和B是接口,那么我将使用虚拟推导来“连接”它们(使它们重叠)。如果您通过指向FunctionA的指针调用B需要不同的实现,那么我强烈建议您选择其他设计。否则会受到伤害。

Impl“源自”AB表示Impl“是”AB。我想你不是故意的。

Impl“实现界面”AB表示Impl“的行为类似于”AB。那么相同的界面应该意味着相同的行为。

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

相关问题