【问题标题】:Should a base class declare methods virtual if there is no need for dynamic polymorphism?如果不需要动态多态,基类是否应该声明虚拟方法?
【发布时间】:2018-12-10 10:40:34
【问题描述】:

使用有没有优势:

struct Base
{
    virtual void foobar();
};

struct Derived : public Base
{
    virtual void foobar() override;
};

代替:

struct Base
{
    void foobar();
};

struct Derived : public Base
{
    void foobar();
};

什么时候不需要动态/运行时多态?如果有,为什么?

谢谢。

【问题讨论】:

  • "如果不需要动态多态?" 那你为什么需要它呢?我的意思是这就是重点
  • 如果你不需要动态多态,那你应该继承吗?也许构图更好。
  • 如果您不需要它,请不要这样做。见stackoverflow.com/questions/292124/…
  • 您只会承受 vtable 和虚拟调用的开销,而不会从中获得任何好处...@MatthieuBrucher 您听起来好像继承应该只与动态多态一起使用...
  • 在这种情况下,您可能不想强制执行动态声明。为什么继承然后隐藏基函数?为什么不只拥有两个不同的、不相关的类?

标签: c++


【解决方案1】:

一个库/程序应该只支持有意义的东西,如果你不打算/你想禁止一个类DerivedBase类型的对象的可能替代品,那么你不应该提供完全没有这种可能。

使用class Derived : public Base,您提供了多态性,如果您提供了它,它的行为应该符合预期。提供一个与基类同名但不覆盖它的成员显然是不期望的,这样做时您应该有充分的理由和良好的文档。

如果您不想提供多态性,您可以继承 private 或者您可以编写:

class B {
public:
    int foo() { return 0; };
};

class D1 : private B {
public:
    int foo() { return B::foo() + 1; };
};

class D2 {
public:
    int foo() { return b.foo() + 1; };
private:
    B b;
};

int main() {

    // B *b = new D1;  // Error cannot cast to private base class B

    // B *b = new D2;  // D2 is not a subclass of B

}

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 2018-12-12
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2011-01-21
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多