-1

我想了解这样一个简单的对象工厂

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对象或Factory_Der对象。似乎将引用工厂对象,但代码不应该工作!(它正在工作)。

谢谢

4

2 回答 2

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对象,那么答案无疑是肯定的。

于 2012-08-20T09:28:10.490 回答
0

您的逻辑问题是您认为 aFactory*仅限于指向一个Factory对象。尽管这样的指针被限制为指向一个Factory或其任何子类(因为它们是Factorys)。在这种情况下this,它指向真正的实例化对象,它确实是 type Factory_Der。你真的应该重新阅读继承,因为在我看来你还没有完全理解它。

于 2012-08-19T22:22:18.537 回答