最佳实践:撰写B,DerivedA撰写DerivedB

时间:2017-01-26 16:15:42

标签: c++ coding-style

  • struct B包含数据。
  • struct DerivedBB将一些特定数据添加到B
  • class A包含对B类型的对象的引用。
  • class DerivedA包含对DerivedB类型的对象的引用。

它本质上是一个糟糕的设计吗?

如果没有,实现该目标的最佳方法是什么?

class A
{
public:
    A() :m_b(std::make_unique<B>(B())) {}
    B& getB() { return *m_b; }
protected:
    A(std::unique_ptr<B> b):m_b(std::move(b)) {}
private:
    std::unique_ptr<B> m_b;
};

class DerivedA : public A
{
public:
    DerivedA() :A(std::make_unique<B>(DerivedB())) {}
    DerivedB& getDerivedB() { return static_cast<DerivedB&>(getB()); }
};

这个使用演员表的解决方案是最好的吗?

2 个答案:

答案 0 :(得分:1)

  

它本质上是一个糟糕的设计吗?

是的,在C ++中,向下转换被认为是一种设计气味。它通常是一个标志,表明您的设计正在打破Liskov substitution principle。 相反,请考虑使用BDerivedB的多态来实现所需的行为。

答案 1 :(得分:0)

也许使用模板?

我在这里举了一个例子: http://melpon.org/wandbox/permlink/oMEzjpnsdOmgKTRs

但这是一种更好的方式吗?