C++中为什么析构函数可以是虚函数,而构造函数不可以是虚函数?

C++中为什么析构函数可以是虚函数,而构造函数不可以是虚函数?

http://topic.csdn.net/t/20041125/14/3587677.html

http://topic.csdn.net/t/20041125/14/3587677.html

6 楼LionEagle(LionEagle)回复于 2002-06-20 09:00:06 得分 0

从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数 
从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有太大的必要成为虚函数

9 楼yyzzbb_yang(eric)回复于 2002-06-20 09:53:29 得分 0

首先你要明白:纯虚拟函数是用来提供函数接口的,虚拟函数是用来提供函数接口和默认的函数操作,非虚拟函数是用来提供函数操作的。而且你一定要记住不要在subclass中重新定义一个非虚拟函数。我想你了解了他们三者的区别,应该知道为什么了吧? 

构造函数是用来构造本对象的,它肯定不能被别人重新定义,因为在别的类中是不可以访问private member的(除了friend class和function);而在继承体系中,base class的析构函数一般声明成virtual function,因为subclass要重新定义它用来摧毁object。Top

10 楼hz129(古雨)回复于 2002-06-20 10:44:45 得分  20

如果有这样两个类: 
class A { 
public: 
A() { a = "A"; f(); } 
virtual ~A() {} 

virtual f() { cout << a << endl; } 
private: 
char* a; 
}; 
class B : public A { 
public: 
B() { b = "B"; } 
~B() {} 

f() { cout << b << endl; } 
private: 
char* b; 
}; 

构造函数调用顺序是先调用基类构造函数,即: A(), B() 
在A()中调用f(),如果按虚函数调用规则,它应该调用B::f(),但此时B还没构造(B()还没有执行),执行B::f()必然是一个错误。所以在构造函数内部执行时,对象还没有完全构造好,不能按虚函数方式进行调用,构造函数本身不能为虚函数也是相同的原因了。Top

11 楼123123123(ruirui)回复于 2002-06-20 11:04:28 得分 0

构造函数和析构函数是由编译器和程序员共同完成,而类的其他成员函数是由程序员完成,所以编译器会对构造函数和析构函数给予特殊的照顾,比如它们不能有返回值,构造函数不可以是虚函数等等。 

析构函数可以是虚函数,而且有的时候是必须的,基类指针指向派生类,用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。 

构造函数不可以是虚函数,因为编译通不过。假如开发编译器的人让它编译通过,有意思的事情就会发生(HAHA),程序会说,我的构造函数在哪?原因是构造函数的地址在虚拟表中,而类的pvtable此时没有被初始化,pvtable可能是任何东西(pvtable初始化在构造函数中完成) 

虚函数C++实现多态的重要机制之一。在C++,如果一个函数在基类被声明为虚函数(virtual),那么在派生类重写这个函数时,可以通过基类的指针或引用来调用派生类重写后的函数实现,而不是基类的函数实现。这样,基类指针或引用可以指向不同类型的对象,而调用的函数是对象实际类型的方法,从而实现运行时多态。 虚基类是为了解决多重继承可能出现的菱形继承(钻石继承)问题而引入的。当一个派生类从两个或多个基类派生,而这些基类又有一个共同的基类时,如果没有特殊的处理,那么共同基类的成员会在派生类出现多份拷贝。通过将共同基类声明为虚基类,可以保证在最终派生类共同基类只有一个实例,从而避免了成员重复和不确定性问题。 虚析构函数是当一个类存在虚函数时,通常将析构函数声明为虚函数。这样,当通过基类的指针删除派生类对象时,可以确保调用正确的析构函数,即派生类的析构函数会被调用,然后再调用基类的析构函数。如果不将析构函数声明为虚函数,则只会调用基类的析构函数,可能导致派生类资源未被正确释放。 至于虚构造函数C++标准并不存在虚构造函数的概念。构造函数的职责是创建对象,而虚函数机制主要用于对象存在并已经初始化之后的多态行为。在C++,创建对象时需要明确知道对象的类型,不能通过基类指针或引用来动态构造一个对象,因为这违反了多态的使用原则。如果需要创建派生类对象,应该使用基类指针或引用,并通过工厂模式、智能指针等方式来实现,而不是虚构造函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值