B
包含数据。DerivedB
:B
将一些特定数据添加到B
。A
包含对B
类型的对象的引用。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()); }
};
这个使用演员表的解决方案是最好的吗?
答案 0 :(得分:1)
它本质上是一个糟糕的设计吗?
是的,在C ++中,向下转换被认为是一种设计气味。它通常是一个标志,表明您的设计正在打破Liskov substitution principle。
相反,请考虑使用B
和DerivedB
的多态来实现所需的行为。
答案 1 :(得分:0)