【问题标题】:How do I choose the base class when overriding a function in c++?在 C++ 中覆盖函数时如何选择基类?
【发布时间】:2017-12-26 22:48:59
【问题描述】:

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

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
        ...
    }
}

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

【问题讨论】:

  • 派生类继承了相同的混合模板类,但参数不同。函数f()其实就是一些类似update()的函数,我需要为不同的参数定义不同的更新函数。
  • 可能是我误解了这个问题,但请考虑使用一个基类和两个派生类,而不是您目前正在做的事情。

标签: c++ overriding multiple-inheritance


【解决方案1】:
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();
};

【讨论】:

  • 这就像一个由内而外的 OOP。拥有一个具有两种不同实现的抽象类似乎是实现相同效果的一种更直接的方法。
【解决方案2】:
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 关键字,因为纯虚函数将因其默认属性而被覆盖。在定义函数时使用基类的范围就像您已经完成的那样。使用 public 访问说明符使派生类能够覆盖纯虚函数。就是这样。

【讨论】:

  • @BaguetteGarlique 我确认,这适用于 MSVC。仍然不确定它是否符合:)
  • 是的,它来自 MSVC
  • 这使用 MSVC 特定的扩展。 clangGCC 都不接受。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
相关资源
最近更新 更多