构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。另外,必须通过基类类型的引用或指针进行函数调用才会发生多态。　#include　　using　namespace　std;　class　A　{　public:　A()　{　cout　<<　"A构造函数";　Test(A()　{　cout　<<　"A析构函数";　cout　<<　"A::Test()"　<<　endl;　}　virtual　void　Test()　{　cout　<<　"A::Test()"　<<　endl;　}　};　class　B:public　A　{　public:　B()　{　cout　<<　"B构造函数";　Test(B()　{　cout　<<　"B析构函数";　Test();　}　virtual　void　Test()　{　cout　<<　"B::Test()"　<<　endl;　}　};　int　_tmain(int　argc,　_TCHAR*　argv[])　{　A*　pA　=　new　B();　cout　<<　"动态调用:";　pA->Test();　delete　pA;　return　0;　}　大神　这个在CB下编译不了　提示_TCHAR*argv[]　has　not　been　declared　构造函数或者析构函数中调用虚函数会怎么样?　简要结论:　1.　从语法上讲,调用完全没有问题。　2.　但是从效果上看,往往不能达到需要的目的。　Effective　的解释是:　派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。　同样,进入基类析构函数时,对象也是基类类型。所以,虚函数始终仅仅调用基类的虚函数(如果是基类调用虚函数),不能达到多态的效果,所以放在构造函数中...　本版专家分:0　引用　楼主　dingdanghe　的回复:　最近在关注C++中能否调用虚函数的问题时,看到有不少文章中提到“构造函数中不能调用虚函数”的说法。经过我在gcc-c++-4.4.7-3.el6.i686,centos6.4系统上试验证明,该说法是错误的。　1.构造函数调用虚函数不存在语法错误　2.构造函数中调用结果运行行为正常,即已具有正常多态行为(因为在进入构造函数函数体之前,构造对象的虚函数表,对象中虚函数表指针,对象成员都已初始化完成,已是完整的派生类对象)。　希望阅贴者补充其他相关内容。　同学,你理解有问题,首先构造函数中不能调用虚函数,不是说语法不允许,最重要的原因在于,当有继承的时候,父类会调用到子类的函数,但是此时子类并没有初始化,会导致数据错误,就这一点足已让你不能在构造函数中调用虚函数。　C++构造函数中不调用虚函数的原因　今天在看网上一篇帖子的时候看到这个问题,试讲关于C++对象虚函数表和类型信息的(RTTI)的,正好看到了如下内容:这个是为什么在构造函数中不能调用虚函数的原因 .因为任何时候在基类中的虚函数调用,都不可能到达子类的实现,因为子类的虚表初始化是在调用完基类的构造之后发生的. 因此在基类中调用虚函数永远只能调用到自己的实现或者更基类的实现,不可能跳转到子类的实现.也就是说,如果你本类的构造　本版专家分:0　引用　16　楼sat00100　的回复:　c++　primer　第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。另外,必须通过基类类型的引用或指针进行函数调用才会发生多态。　#include　　using　namespace　std;　class　A　{　public:　A()　{　cout　<<　"A构造函数";　Test(A()　{　cout　<<　"A析构函数";　cout　<<　"A::Test()"　<<　endl;　}　virtual　void　Test()　{　cout　<<　"A::Test()"　<<　endl;　}　};　class　B:public　A　{　public:　B()　{　cout　<<　"B构造函数";　Test(B()　{　cout　<<　"B析构函数";　Test();　}　virtual　void　Test()　{　cout　<<　"B::Test()"　<<　endl;　}　};　int　_tmain(int　argc,　_TCHAR*　argv[])　{　A*　pA　=　new　B();　cout　<<　"动态调用:";　pA->Test();　delete　pA;　return　0;　}　即便出现这个结果,也是因为新版编译器不支持构造函数中调用虚函数,当检测到构造函数中有虚函数时,会强行改变为调用类自身的函数,因为编译器不这么做就导致你不确定的数据错误,这也间接说明了,不能在构造函数中调用虚函数的。请明白其中的原因。其实你看看反编译的汇编代码就明白了。　匿名用户不能发表回复!　首先:到底能不能将构造函数声明为虚函数?答案是不能。　可以,虚函数底层实现原理(但是最好不要在构造和析构函数中调用)　可以,但是没有动态绑定的效果,父类构造函数中调用的仍然是父类版本的函数,子类中调用的仍然是子类版本的函数。　effictive　c++第九条,绝不在构造和析构过程中调用virtual,因为构造函数中的base的虚函数不会下降到derived上。而是直接调用base类的虚函数。绝不在构造和析构函数中调用virtual函数...　构造函数里面包含virtual函数的情况先看一段代码class　Transaction　{//　所有交易的基类　public:　Transaction();　virtual　void　logTransaction()　const　=　0;//建立依赖于具体交易类型的登录项　...　};　Transaction::Transaction()　//实现基类的构...　谈谈关于构造函数中调用虚函数的情况,仅讨论单继承,不考虑虚拟继承和多重继承。测试平台:VS2013　+　Win7X64一个例子:#include　<stdlib.h>#include　<stdio.h>class　Base{private:　int　__data;public:　...　这是一个“鸡生蛋还是蛋生鸡”的问题。首先我们要明白,虚函数是如何调用的。如果一个类有虚函数,那么必然对应一个虚函数表vtable,这个虚函数表的指针指向的是虚函数的地址。当一个基类指针想要调用派生类的虚函数的时候,需要通过这个虚函数表来查找调用这个派生类的虚函数。那么,既然知道了虚函数是如何调用的,那么虚函数表是什么时候形成的呢?它是构造函数初始化示例的时候进行初始化的,也就是说构造函数初...　铁律一:最好不要在构造函数和析构函数中调用虚函数!构造派生类对象时,首先调用基类构造函数初始化对象的基类部分。在执行基类构造函数时,对象的派生类部分是未初始化的。实际上,此时的对象还不是一个派生类对象。析构派生类对象时,首先撤销/析构他的派生类部分,然后按照与构造顺序的逆序撤销他的基类部分。因此,在运行构造函数或者析构函数时,对象都是不完整的。为了适应这种不完整,编译器将对象的类型视为在调用...　先看一段在构造函数中直接调用虚函数的代码:　1　#include　<iostream>　2　3　class　Base　4　{　5　public:　6　Base()　{　Foo(lt;　打印　1　7　8　virtual　void　Foo()　9　{10　std::cout　<...　#include　#include　using　namespace　std;struct　CLS{　int　m_i;　CLS(　int　i　)　:　m_i(i){}　CLS()　{　CLS(0);　}};int　main(){　CLS　obj;　cout　<<　obj.m_i　<<　endl;　sys　在构造函数里不能调用shared_from_this()又一次调到坑里,mark一下　Effective　C++中提到,尽量不要再构造函数中调用虚函数,主要是在基类　大婶们啊:为什么不能再构造函数中执行大量的内存分配、文件读写等复杂操作???　内容来源:　传智播客c++面试中常常会问到一个问题:通过子类对象,在父类构造函数中调用虚函数,能实现多态吗?#iinclude<iostream>using　namespace　std;class　A　{public:　int　a;　A(int　a)　{　this->a　=　a;　print();　}　virtual　void　print()　...　effective　c++　的item9中提到,不要在构造函数中调用虚函数,因为此时的虚函数不具有多态性。　 给出的原因是说构造基类的时候,还未初始化派生类的成员变量。而网上很多说法说是虚表未建立。其实,结合类的内存模型,再稍加分析,很容易可以找出更具体的原因。具有虚函数的类的内存结构里除了非静态变量,还有一个虚指针,指向了虚表。　 网上说的虚表为建立的说法是不合适的,因为同一个类的所有实例共　问题c++中的new操作符　通常完成两个工作　分配内存及调用相应的构造函数。请问:1)如何让new操作符不分配内存,只调用构造函数?2)这样的用法有什么用?placement　new的含义placement　new可以实现不分配内存,只调用构造函数。