C++为什么没有虚拟构造函数?
C++为什么没有虚拟构造函数?
虚构造函数的概念并不太适用,因为对象类型是对象创建的先决条件,但它并不完全被否定。
GOF的“工厂方法”设计模式利用了虚构造函数的“概念”,在某些设计情况下非常方便。
每个具有一个或多个“虚拟函数”的类都会创建一个虚拟表(vtable)。当创建这样一个类的对象时,它包含一个“虚拟指针”,该指针指向相应vtable的基地。每当有虚拟函数调用时,将使用vtable来解析函数地址。 构造函数不能是虚拟的,因为当执行类的构造函数时,在内存中没有vtable,也就是说还没有定义虚拟指针。因此,构造函数应始终是非虚拟的。
在C++中,虚构造函数是不可能存在的。例如,您无法将构造函数标记为虚拟。请尝试以下代码:
#include<iostream.h>
using namespace std;
class aClass
{
public:
virtual aClass()
{
}
};
int main()
{
aClass a;
}
它会导致一个错误。这段代码试图将构造函数声明为虚函数。现在让我们尝试理解为什么我们使用虚关键字。虚关键字用于提供运行时多态性。例如,尝试此代码。
#include<iostream.h>
using namespace std;
class aClass
{
public:
aClass()
{
cout<<"aClass contructor\n";
}
~aClass()
{
cout<<"aClass destructor\n";
}
};
class anotherClass:public aClass
{
public:
anotherClass()
{
cout<<"anotherClass Constructor\n";
}
~anotherClass()
{
cout<<"anotherClass destructor\n";
}
};
int main()
{
aClass* a;
a=new anotherClass;
delete a;
getchar();
}
a=new anotherClass;
为 aClass
类型的指针 a
分配了一个 anotherClass
的内存。这会自动调用构造函数(在aClass
和anotherClass
中)。因此,我们不需要将构造函数标记为虚拟的。因为当对象被创建时,它必须按照创建链(即先基类,然后派生类)的顺序进行。
但是,当我们尝试删除 delete a;
时,只会调用基类析构函数。因此,我们必须使用虚拟关键字来处理析构函数。 因此,虚拟构造函数不可能,但虚拟析构函数是可以的。谢谢。A f(g);
调用了一个复制构造函数。而且,它可能是一个成员函数的对象g
。或者void foo(A a); ... foo(f);
。在这里,我们需要构造一个新的A
来调用foo
,并且可以看到有一个对象它可能是一个成员函数 -- f
。 - David Schwartz