问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++的构造函数调用虚函数

发布网友 发布时间:2022-05-17 09:22

我来回答

2个回答

热心网友 时间:2023-10-17 04:37

的确如你所想,继承类在构造的时候总是(记住这个“总是”)首要调用基类的构造函数来对属于基类的部分进行构造,在这个时候整个类都是被当作基类来处理的,继承类的部分此对C++来说好象不存在一样,直到继承类的构造函数被调用并构造以后,该类才被当作继承类类处理;对于析构也是一样。你可以从下面代码的执行情况中看出:

#include <iostream>
#include <typeinfo>
using namespace std;

class A
{
public:
A()
{
cout << "Type name of *this: " << typeid(*this).name() << endl;
}
};

class B : public A
{
public:
B()
{
cout << "Type name of *this: " << typeid(*this).name() << endl;
}
};

int main()
{
B b;
}

按照虚函数的性质,按道理是调用B::p(),但如果此时调用的是子类的函数的p(),由于子类并没有构造,所以调用p()函数所使用的数据成员包含的其实是垃圾,这将导致不可预料的未定义行为和后期的大量调试,对于这种本质上就危险的行为C++是没有理由让你去做它的。

参见Effective C++

条款9:Never call virtual functions ring construction or destruction

Scott Meyers已经解释得很详细了...

热心网友 时间:2023-10-17 04:38

的确如你所想,继承类在构造的时候总是(记住这个“总是”)首要调用基类的构造函数来对属于基类的部分进行构造,在这个时候整个类都是被当作基类来处理的,继承类的部分此对C++来说好象不存在一样,直到继承类的构造函数被调用并构造以后,该类才被当作继承类类处理;对于析构也是一样。你可以从下面代码的执行情况中看出:
#include
<iostream>
#include
<typeinfo>
using
namespace
std;
class
A
{
public:
A()
{
cout
<<
"Type
name
of
*this:
"
<<
typeid(*this).name()
<<
endl;
}
};
class
B
:
public
A
{
public:
B()
{
cout
<<
"Type
name
of
*this:
"
<<
typeid(*this).name()
<<
endl;
}
};
int
main()
{
B
b;
}
按照虚函数的性质,按道理是调用B::p(),但如果此时调用的是子类的函数的p(),由于子类并没有构造,所以调用p()函数所使用的数据成员包含的其实是垃圾,这将导致不可预料的未定义行为和后期的大量调试,对于这种本质上就危险的行为C++是没有理由让你去做它的。
参见Effective
C++
条款9:Never
call
virtual
functions
ring
construction
or
destruction
Scott
Meyers已经解释得很详细了...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 养宠物的人遵守规则,是不是就能和别人平安相处呢? 构造函数中间接调用虚函数 构造函数里面调用虚函数会报错么 电子秤可以竖着放吗 本公司是一家建筑公司,本公司收购另外一家建筑公司,请问被收购公司的资质能转移到本公司吗?转移程序? 企业迁移到他省 预缴增值税余额如何处理? 建筑企业迁移到外省,法人的安全A证一直没有迁出,是否影响企业的经营活动? 建筑公司请电力公司迁移电线杆付的工程服务记什么科目 建筑公司迁移时公司人员配置需配备齐全吗? 一个肉包子或者茄子包子的热量高吗? 一个肉包的热量和一个肉包子的皮的热量 是一个肉包的热量大还是豆沙包 早上是一个肉包和一碗粥,中午是粗粮麦片和一个橘子晚上是一个苹果和一个梨,这么多的总热量是多少 大班语言游戏家电 上海这边一个肉包加一杯豆浆或豆花热量?如果换花卷,白馒头或两个烧卖热量呢? 手机怎么申诉QQ密码? TCH20VM9210锂电角磨锂电池多少钱一块?哪里有卖的? 20v充电角磨机电池测量正负极有12v电压就是冲不进电是什么原因呢?_百度问一问 20v角磨机能不能接24V 建企业网站用哪个建站系统更方便? 适合企业建站的系统那个好 构造函数和析构函数中能否调用虚函数 为啥不要在构造函数中调用虚函数 为什么不要在构造函数中调用虚函数 如何让构造函数具有虚函数的效果?c++ MFC的CWinApp的构造函数是怎么调用虚函数InitInstance()的? C++类的构造函数不能调用该类的虚函数?那我想在 初始化这个类的时候就 执行某个虚函数怎么办? 桥边上卖闪电,成都话什么意思 - 信息提示 成都话卖闪电是什么意思 物理 ,请问 电场中某点场强的方向就是将点电荷放在该点所受电场力的方向 这句话是对的吗? 四川话闪电怎么说 同一个手机号可以分身三个吗 怪盗基德是超级英雄请问有没有这本书的网盘。有的话请发一下。 如何用键盘关掉电脑的声音? 你已设置拒登录换绑注册短信这个要怎么关闭? 你已设置拒登录换绑注册短信这个要怎么关闭- 问一问 微信更换手机号提示:你已设置拒登录、换绑、注册短信是怎么回事?_百度问一问 换绑的时候显示:你已设置拒登录,换绑,注册短信该怎么办? 微信团队提示我的正在尝试登陆一个新设备方式是短信验证码 是怎么回事啊 你已设置拒登录换绑注册短信这个要怎么关闭