在 Meyers Effective C++ item 31(我的第 3 版中的 p147)中,他谈到了接口类。他展示了一个带有纯虚方法和派生类 RealPerson 的 Person 类的示例。它看起来像这样,尽管我已经对其进行了简化并添加了一些简单的实现。
#include <string>
class Person {
public:
virtual ~Person() {};
virtual std::string name() const = 0;
};
class RealPerson : public Person {
public:
RealPerson(const std::string& name) : theName(name) {}
virtual ~RealPerson() {};
virtual std::string name() const { return theName; }
private:
std::string theName;
};
然后他接着说,我们可以轻松地创建一个“工厂功能”来创建真实的人:
std::shared_ptr<Person>Person::create(const std::string& name) // EDIT - removed tr1::
{
return std::shared_ptr<Person>(new RealPerson(name));
}
当我可以以正常方式实例化 RealPerson 类时,为什么还要使用这个“创建”函数?
另外,为什么派生类方法是“虚拟的”。
编辑
感谢您的评论。我理解目的(现在),但我看不出它与任何层次结构中的任何基类有什么不同——这种工厂函数在所有基类中都是典型的吗?它也有一种杂乱无章的感觉,而不是语言的一部分。但我对 C++ 比较陌生,所以这可能只是我的问题。