Abtract类派生自一个正常的类。这有效吗?

时间:2017-03-27 09:47:26

标签: c++ class polymorphism override

以下是C ++中的有效设计吗?

#include <iostream>
#include <memory>

using namespace std;

struct Base {
    virtual void SomeMethod() {
        std::cout<<"Do Something"<<std::endl;
    }
};

struct Der : public Base {
    virtual void SomeMethod() override = 0;
};

struct DerDer : Der {
    virtual void SomeMethod() override
    {
        std::cout<<"Do something derived."<<std::endl;
    }
};

int main(int argc, char *argv[])
{
    auto x = std::unique_ptr<Base>(new DerDer);
    x->SomeMethod();
    return 0;
}

适用于g ++ 6.2。

我从普通类派生,将该方法转换为抽象,然后在再次派生后重写它。

从C ++派生类是否正确,然后将实现的方法转回抽象?

我需要这样做的原因是,在我要添加功能的大型程序中,我试图avoid a diamond model。为此,我计划将所有常用方法放在类Der中,并使所有内容继承自它,而不会弄乱Base类。

3 个答案:

答案 0 :(得分:1)

那是合法的。

但是如果你想避免使用diamon模型,那就有another workarounds

答案 1 :(得分:-1)

绝对合法。如果您愿意,可以将其视为纯虚函数的实现。 请参阅此处的讨论pure virtual function with implementation

答案 2 :(得分:-1)

从技术上讲,没有任何问题,但从具体类继承接口(或抽象类)时,它永远不是一个好的设计。

如果要在Der中提供一些常用功能,可以使用合成。因为你的类Der就像一个实用程序类。不要将der class作为抽象类。

Class DerDer : class base
{
  private der ptrUtilityObj;
}

将来可能会有一些新的开发人员会混淆他应该在Base类或Der类中引入新功能。