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

QbP*_*rog 20 c++ virtual overriding diamond-problem

我有类似的东西(简化)

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

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

class Impl : public A , public B
{
  public:
        ????
};
Run Code Online (Sandbox Code Playgroud)

如何为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; }
};
Run Code Online (Sandbox Code Playgroud)

谢谢!

Joh*_*itb 31

你不能在那里使用合格的名字.我写的void Function() { ... }你压倒了这两个功能.Herb Sutter展示了它是如何解决的.

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


小智 5

我可以建议另一种方法来解决这个问题。您可以通过添加虚拟参数来添加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;
  }
};
Run Code Online (Sandbox Code Playgroud)

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