在 C++ 中覆盖函数时如何选择基数 class?

How do I choose the base class when overriding a function in c++?

我有两个基础 classes 和一个继承两个基础 classes 的 class。 两个基础 classes 都有一个具有相同签名的虚函数,我想在派生的 class 中为每个虚函数提供不同的实现。

class A{
    virtual void f() = 0;
}
class B{
    virtual void f() = 0;
}
class Derived:public A, public B{
    void A::f() override{ // Error
        ...
    }
    void B::f() override{ // Error
        ...
    }
}

正确的做法是什么? (我无法重命名虚函数。实际上这两个基数 class 是从同一个模板 class 生成的。)

template <typename T>
class AShim : public A {
  void f() override {
    static_cast<T*>(this)->A_f();
  }
};

template <typename T>
class BShim : public B {
  void f() override {
    static_cast<T*>(this)->B_f();
  }
};

class Derived: public AShim<Derived>, public BShim<Derived> {
  void A_f();
  void B_f();
};
class A {
public:
    virtual void f() = 0;
};
class B {
public:
    virtual void f() = 0;
};
class Derived :public A, public B {
public:
    void A::f() {
        cout << "Inside A's version"<<endl;
    }
    void B::f() { 
        cout << "Inside B's version"<<endl;
    }
};

int main()
{
    Derived derived;
    cout << "calling A" << endl;
    A *a;
    a = &derived;
    a->f();
    cout << "calling B" << endl;
    B *b;
    b = &derived;
    b->f();
}

对我来说很好用。无需明确提及 override 关键字,因为在定义函数 时,纯虚函数将凭借其默认 properties.Use 基础 class 的作用域被覆盖 [=15] =].使用 public 访问说明符启用派生的 classes 来覆盖纯虚函数。就这些了。