English 中文(简体)
虚拟构造函数
原标题:
  • 时间:2008-09-16 09:07:49
  •  标签:

是否需要虚拟建设者?如果是的话,有人能发布一个场景吗?

问题回答

如果您谈论的是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

一如既往:查阅C++常见问题解答lite:虚拟函数

它不仅会解释“虚拟构造函数”,还会解释析构函数!

当然,如果你一开始就想要C++。。。

有很多场景,例如,如果您想为多个环境创建GUI。假设您有控件的类(“小部件”),但每个环境实际上都有自己的小部件集。因此,为每个环境创建这些小部件的子类是合乎逻辑的。实现这一点的方法(因为,正如已经毫无帮助地指出的那样,构造函数在大多数语言中实际上不可能是虚拟的)是使用抽象工厂,上面的例子实际上是用来描述这种设计模式的标准例子。

Delphi是一种支持虚拟构造函数的语言。

通常,它们将用于类工厂类型场景,在该场景中创建一个元类型,即描述类型的类型。然后,您将使用该元类型来构造子类的具体示例

代码应该是。。。。

type
  MyMetaTypeRef = class of MyBaseClass;

var
  theRef : MyMetaTypeRef;
  inst : MyBaseClass;
begin 
  theRef := GetTheMetaTypeFromAFactory(); 
  inst := theRef.Create(); // Use polymorphic behaviour to create the class

用什么语言?例如,在C++中,构造函数不能是虚拟的。

根据定义,构造函数不能是虚拟的。在调用构造函数时,还没有创建任何对象,因此多态性没有任何意义。

在C++中,构造函数没有理由是虚拟的,因为它们是静态函数。这意味着它们是静态绑定的,所以你必须确定你正在调用的构造函数才能调用它。它没有任何不确定性,也没有任何虚拟性。

这也意味着,无论怎样,你都需要知道你的对象将要成为的类。然而,你可以做的是这样的事情:

Superclass *object = NULL;
if (condition) {
    object = new Subclass1();
}
else {
    object = new Subclass2();
}
object.setMeUp(args);

…有一个虚拟函数,并在构造后调用它。这是Objective-C中的一个标准模式,在该模式中,首先调用类的“alloc”方法来获取实例,然后调用适合您使用的initializer。

不过,提到抽象工厂模式的人可能更适合C++和Java。

在C++中,所有构造函数都是隐式虚拟的(有一点额外的)。也就是说,基类的构造函数在派生类的构造函数之前被调用。所以,它们有点像虚拟的。因为,在虚拟方法中,如果派生类实现了具有相同签名的方法,则只调用派生类中的方法。

但是,在构造函数中,两种方法都被卷入(请参阅下面的示例)。

要想更完整地解释为什么会这样,请参阅Scott Meyers的Effective C++第三版第9项(在构建或销毁过程中永远不要调用虚拟函数)。该项目的标题可能会对问题产生误导,但如果你阅读了解释,它将完全有意义。

#include <iostream>
#include <vector>

class Animal {

    public:

        Animal(){
            std::cout << "Animal Constructor Invoked." << std::endl;
        }

        virtual void eat() {
            std::cout << "I eat like a generic animal.
";
        }

        //always make destructors virtual in base classes
        virtual ~Animal() {

        }

};

class Wolf : public Animal {

    public:

        Wolf(){
            std::cout << "Wolf Constructor Invoked." << std::endl;
        }

        void eat() {
            std::cout << "I eat like a wolf!" << std::endl;
        }

};


int main() {

    Wolf wolf;
    std::cout << "-------------" << std::endl;
    wolf.eat();

}

输出:

Animal Constructor Invoked.
Wolf Constructor Invoked.
-------------
I eat like a wolf!

虚拟构造函数在C++中没有意义。这是因为在C++中,构造函数没有返回值。在其他一些编程语言中,情况并非如此。在这些语言中,构造函数可以直接调用,并且构造函数有一个返回值。这使得它们在实现某些类型的设计模式时非常有用。然而,在C++中,情况并非如此。





相关问题
热门标签