如果不需要动态多态,基类是否应该将方法声明为虚拟方法?

时间:2018-12-10 10:40:34

标签: c++

使用有优势吗?

struct Base
{
    virtual void foobar();
};

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

代替:

struct Base
{
    void foobar();
};

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

何时不需要动态/运行时多态性?如果是这样,为什么?

谢谢。

1 个答案:

答案 0 :(得分:3)

库/程序应仅支持有意义的内容,如果您不打算/要禁止类Derived可以替代类型Base的对象,则您完全不应该提供这种可能性。

使用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

}