虚拟构造函数
是否需要虚拟构造函数?如果可以,那么任何人都可以发布方案吗?
解决方案
回答
用什么语言?例如,在C ++中,构造函数不能是虚拟的。
回答
与往常一样:查看C ++常见问题精简版:虚拟函数。
它不仅会解释"虚拟构造函数",还会解释析构函数/函数!
当然,如果我们首先要使用C ++,这当然...
回答
根据定义,构造函数不能是虚拟的。在构造函数调用时,尚未创建任何对象,因此多态性没有任何意义。
回答
如果我们在谈论C ++中的虚拟析构函数(不存在任何诸如虚拟构造函数之类的东西),那么如果我们多态地使用子类,则应始终使用它们。
class A { ~A(); } class B : public A { ~B(); } A* pB = new B(); delete pB; // NOTE: WILL NOT CALL B's destructor class A { virtual ~A(); } class B : public A { virtual ~B(); } A* pB = new B(); delete pB; // NOTE: WILL CALL B's destructor
编辑:不确定为什么我对此有反对意见(如果我们发表评论会很有帮助...),但也请在此处阅读
http://blogs.msdn.com/oldnewthing/archive/2004/05/07/127826.aspx
回答
Delphi是一种支持虚拟构造函数的语言。
通常,它们将在创建元类型(即描述类型的类型)的类工厂类型场景中使用。然后,我们将使用该元类型构造后代类的具体示例
代码就像...。
type MyMetaTypeRef = class of MyBaseClass; var theRef : MyMetaTypeRef; inst : MyBaseClass; begin theRef := GetTheMetaTypeFromAFactory(); inst := theRef.Create(); // Use polymorphic behaviour to create the class
回答
有很多方案,例如,如果要为多个环境创建GUI。假设我们有控件类(小部件),但每个环境实际上都有自己的小部件集。因此,为每种环境将这些小部件的创建子类化是合乎逻辑的。做到这一点的方法(由于已经无奈地指出,在大多数语言中构造函数实际上都不是虚拟的),是采用抽象工厂,而上面的示例实际上是用于描述此设计模式的标准示例。
回答
在C ++中,构造函数没有理由是虚拟的,因为它们是静态函数。这意味着它们是静态绑定的,因此我们必须确定要调用的构造函数才能完全调用它。没有不确定性,也没有虚拟的东西。
这也意味着,无论如何,我们都需要知道对象将要成为的类。但是,我们可以执行以下操作:
Superclass *object = NULL; if (condition) { object = new Subclass1(); } else { object = new Subclass2(); } object.setMeUp(args);
...有一个虚函数,在constructon之后调用它。这是Objective-C中的标准模式,其中首先调用类的" alloc"方法以获取实例,然后调用适合用途的初始化程序。
提到Abstract Factory模式的人可能更适合C ++和Java。