是否可以在 运行 时间确定对象选择的情况下使用 C++ 对象组合?

Is it possible to use C++ object composition where choice of object is determined at run-time?

假设我有一张 class 脸。我希望使用组合来构建面部。脸部有眼睛,所以我可以创建一个 class 眼睛并使用合成将眼睛添加到脸部。

但是,如果我 class 眼睛,例如

class Eyes { ... };
class BlueEyes : public Eyes { ... };
class BrownEyes : public Eyes { ... };

? (假设接口都是相同的。)

是否可以在 运行 时间合成人脸,比如根据提供给构造函数的某些参数,人脸会得到 BlueEyes 或 BrownEyes?

你要找的是工厂设计模式。

您的工厂收到要实例化的 class 的名称和任何必需的参数,然后实例化适当的子 class。该名称可以采用字符串、枚举类型或任何其他选择适当 subclass 的方式的形式。让我们使用一个字符串:

Eyes *create_eyes(const std::string &color)
{
   if (color == "blue")
          return new BlueEyes;

   if (color == "brown")
          return new BrownEyes;

   throw "Unknown eye color";
}

您可以通过编写一个指向基数 class 的指针来做到这一点。例如,

enum EyeColor{Blue, Brown}; // Even better would be enum class

class Face
{
private:
    // Here is the composition - to a base-class ptr.
    std::unique_ptr<Eyes> m_eyes;

public:
    explicit Face(EyeColor c) 
    {
        // Use c to instantiate m_eyes below to the appropriate-class object.
    }
};

事实上,一些设计模式的 C++ 实现,例如 Strategy,经常使用这个。