虚拟构造函数

时间:2020-03-05 18:55:27  来源:igfitidea点击:

是否需要虚拟构造函数?如果可以,那么任何人都可以发布方案吗?

解决方案

回答

用什么语言?例如,在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。