我希望像这样了解一个简单的对象工厂。
template <class Base>
class Factory
{
protected:
Factory (std::string name)
...
}
Factory<Base>::Factory (std::string name)
{
Factory_Map[name] = this;
}
//-------------------------------------
template <class Derived, class Base>
class Factory_Der: public Factory<Base>
{
public:
Factory_Der(std::string name) : Factory<Base>(name) { }
...
};
因此 Factory_Der 的构造函数将调用 Factory 的构造函数。但我不知道工厂的构造函数中的此指针将引用 Factory 对象或 Factory_Der 对象。似乎这个会引用工厂对象,但代码应该不起作用! (它正在运作)。
由于
答案 0 :(得分:3)
首先,你创建了一个对象,一个Factory_Der
对象,对吧?所以当你问,this
指针指向哪个对象时,它指向 的对象是什么?你只有一个对象 - 一个Factory_Der
对象。
由于Factory_Der
继承自Factory
,因此Factory_Der
对象的部分内存布局可被视为Factory
对象。但它是同一个对象的一部分。
Factory
对象。
你似乎陷入了这些都是构造函数的事实。但是构造函数非常类似于方法,除了它们的特殊之处在于它们在内存分配之后的对象构造期间被“自动调用”。你可以想象这个对象构造:
Factory_Der *foo = new Factory_Der;
将下面翻译成类似的东西(不是真正的语法;但这就是Objective-C的用法):
Factory_Der *foo = malloc(sizeof(Factory_Der));
foo->constructor();
这解释了为什么构造函数中的this
指向对象。
在每个构造函数的开头,可以指定一个可选的初始化列表,它指定如何初始化基类和字段。 (如果跳过初始化器的某些东西,则选择默认值。)所以基本上,构造函数在一开始就自动调用超类的构造函数。
再次,我们可以想象你的构造函数:
Factory_Der(std::string name) : Factory<Base>(name) { }
在下面翻译成这样的东西:
void constructor(std::string name) { this->Factory<Base>::constructor(name); }
所以你看,派生类的构造函数基本上将其this
“传递”给基类的构造函数。因此,他们从this
看到的对象是同一个对象。
当然,在基类的构造函数运行时,未设置派生类的状态。因此,对象是否可以真正被视为派生类对象是一个有争议的问题。但是,如果你的问题是Factory
的构造函数从this
看到的对象是否是最终将成为Factory_Der
对象的对象,那么答案肯定是肯定的。
答案 1 :(得分:0)
您的逻辑问题是您认为Factory*
被限制为指向Factory
对象。虽然这样的指针被限制为指向Factory
或其任何子类(因为它们是Factory
s)。在这种情况下,this
指向真实类型为Factory_Der
的实例化对象。你应该重新读取继承,因为在我看来你还没有完全理解它。