struct B保存数据。
struct DerivedBBB添加一些特定数据。
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()); }
};


这种使用强制转换的解决方案是最好的吗?

最佳答案

它本质上是不好的设计吗?


是的,向下转换通常在C ++中被视为一种设计气味。它通常是一个标志,指示您的设计正在破坏Liskov substitution principle
而是考虑对BDerivedB使用多态来实现所需的行为。

08-16 16:59