虚拟构造器

时间:2008-09-16 09:07:49

标签: virtual constructor scenarios

是否需要虚拟构造器?如果有的话可以发布一个场景吗?

9 个答案:

答案 0 :(得分:8)

如果你在谈论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

编辑:我不确定为什么我会为此做出一个downvote(如果你发表评论会很有帮助......)但是也可以在这里阅读

http://blogs.msdn.com/oldnewthing/archive/2004/05/07/127826.aspx

答案 1 :(得分:3)

一如既往:抬头看C++ FAQ lite: virtual functions

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

当然,如果你想要C ++ ......

答案 2 :(得分:2)

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

通常,它们将用于类工厂类型方案,您可以在其中创建元类型,即描述类型的类型。然后,您将使用该元类型构建后代类的具体示例

代码就像....

type
  MyMetaTypeRef = class of MyBaseClass;

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

答案 3 :(得分:2)

有很多场景,例如,如果您想为多个环境创建GUI。假设您有控件类(“小部件”),但每个环境实际上都有自己的小部件集。因此,为每个环境创建这些小部件是合乎逻辑的。执行此操作的方法(因为,正如无益指出的那样,构造函数实际上在大多数语言中都不是虚拟的),是使用abstract factory,上面的示例实际上是用于描述此设计的标准示例图案。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

在C ++中,构造函数没有理由永远是虚拟的,因为它们是静态函数。这意味着它们是静态绑定的,因此您必须识别您正在调用的构造函数,以便完全调用它。没有任何不确定性,也没有什么虚拟的。

这也意味着,无论如何,您需要知道您的对象将要成为的类。但是,你可以做的是这样的事情:

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

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

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

答案 7 :(得分:-1)

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

但是,在构造函数中,两种方法都被调用(参见下面的示例)。

有关为何如此的更完整解释,请参阅有效C ++第3版第9项,作者:Scott Meyers(在构建或销毁期间永远不要调用虚函数)。该项目的标题可能会误导该问题,但如果您阅读了解释,那将是完全合理的。

#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.\n";
        }

        //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!

答案 8 :(得分:-1)

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