对象工厂和这个指针
Object Factory and this Pointer
我想了解这样一个简单的对象工厂。
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。看起来这个将引用工厂对象,但代码不应该工作!(它正在发挥作用)。
感谢
首先,您创建了一个对象,一个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
对象的对象,那么答案肯定是肯定的。
您的逻辑问题是,您认为Factory*
被限制为指向Factory
对象。尽管这样的指针被限制为指向Factory
或其任何子类(因为它们是Factory
s)。在这种情况下,this
指向实际实例化的对象,该对象实际上是Factory_Der
类型。你真的应该重读继承,因为在我看来你还没有完全理解它
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 我应该如何在工厂类中存储弱指针列表?
- 工厂:如何将临时智能指针传递给函数.C++
- 定义一个工厂函数,该函数返回指向在此工厂函数中创建的函数的指针
- 我怎样才能获得指向工厂::方法(可变参数..)的指针以进行懒惰调用
- 对象工厂和这个指针
- 如果没有指针会发生什么情况,获取工厂函数指针
- 工厂函数的最佳智能指针返回类型是什么
- 我是否必须从工厂返回指针
- c++代码生成:为函数指针创建工厂
- 克隆智能指针vs抽象工厂
- 没有指针(包括智能指针)或副本的高效工厂函数
- 在工厂中使用指针函数会产生编译时错误
- 用于智能指针(intrusive_ptr)的抽象基类-处理继承性、多态性、可克隆性和从工厂返回的方法