构造函数可以调用虚函数吗?语法上通过吗

 我来答
琉璃易碎smile
2015-10-21 · TA获得超过1.6万个赞
知道大有可为答主
回答量:4789
采纳率:92%
帮助的人:322万
展开全部
可以,但最好不要这样用
在构造函数中调用虚成员函数,虽然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造过程的理解。这个问题也和一般直观上的认识有所差异。先看看下面的两个类定义。
struct C180 {
C180() { foo(); this->foo(); }
virtual foo() {
cout << "<< C180.foo this: " << this << " vtadr: " << *(void**)this << endl; } };
struct C190 : public C180 {
C190() {}
virtual foo() {
cout << "<< C190.foo this: " << this << " vtadr: " << *(void**)this << endl; } };
父类中有一个虚函数,并且父类在它的构造函数中调用了这个虚函数,调用时它采用了两种方法一种是直接调用,一种是通过this指针调用。同时子类又重写了这个虚函数。
我们可以来预测一下如果构造一个C190的对象会发生什么情况。
我们知道,在构造一个对象时,过程是这样的:
1) 首先会按对象的大小得到一块内存(在heap上或在stack上),
2) 把指向这块内存的指针做为this指针来调用类的构造函数,对这块内存进行初始化。
3) 如果对象有父类就会先调用父类的构造函数(并依次递归),如果有多个父类(多重继承)会依次对父类的构造函数进行调用,并会适当的调整this指针的位置。在调用完所有的父类的构造函数后,再执行自己的代码。
照上面的分析构造C190时也会调用C180的构造函数,这时在C180构造函数中的第一个foo调用为静态绑定,会调用到C180::foo()函数。第二个foo调用是通过指针调用的,这时多态行为会发生,应该调用的是C190::foo()函数。
huanglenzhi
2014-12-28 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517198
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  C++是不允许虚构造函数。

  测试代码:

  class A
{
public:
virtual A()
{
cout<<"sgsfsdfasf";
}
private:
int x;
};
int main()
{
A a;
return 0;
}
错误信息:error C2633: 'A' : 'inline' is the only legal storage class for constructors
我就去找了一下为什么。下面是找到的一点信息。

虚构造函数是有用的,最常见的情况就是持久化支持。将对象从持久化源中取出来就非常需要一种类似虚构造函数的机制。事实上我们通常用设计模式来做到这一点,那就是abstract factory。
c++不支持虚构造函数的原因说来既简单又复杂:
1、简单的说,c++中没有实现虚构造函数的简单方法。实现虚构造函数必然要依赖于某种运行时反射机制,而c++只有最弱的rtti机制,实现这种反射需要付出的代价相当昂贵,从速度到空间都有。
2、复杂的说,虚构造函数与c++的现有体系是非自谐的。虽然c++基本上是一个实用主义语言,自谐从来不是它的目标,比如与c的兼容性就非常影响它的自谐性,但一个与整个体系的方向相背离的特性对整个语言是一种严重的伤害。所谓违背自谐,简单的理解就是,它会影响已有的特性。

c++之父已经说过,“虚拟”构造函数,可以轻易绕过去。
在构造函数里,调用一个虚函数来执行真正的初始化动作即可。

虚函数是动态绑定的,也就是说,使用虚函数的指针和引用能够正确找到实际类的对应函数,而不是执行定义类的函数。
构造函数不能是虚函数。而且,在构造函数中调用虚函数,实际执行的是父类的对应函数,因为自己还没有构造好, 多态是被disable的。

另外,析构函数允许为虚并且往往是必要的。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式