在构造和析构期间对虚函数的调用不总是这么容易能够被发现。如果Transaction有多个构造函数,每个构造函数必须执行相同的工作,防止代码重复的一个好的软件工程是将普通的初始化代码,包含对logTransaction的调用,放到一个私有的非虚初始化函数中,也即是 Init: 1classTransaction {23public:45Transaction()67{ init(); }...
<C/C++> 构造和析构函数中调用虚函数 <Effective C++> Item 9: 绝不要在构造和析构函数中调用virtual函数 看如下代码: #include <iostream>usingnamespacestd;classA {public:~A() {//这里我并没有声明成虚析构,当然虚析构更好理解问题foo(); }voidbar(void) { foo(); }virtualvoidfoo(void) { cou...
从构造函数和析构函数中调用虚函数并不是本身有什么错误。这种调用的语义是安全的。然而,经验表明这样的调用很少是必须的,很容易扰乱维护者,如果被新手使用会成为错误源。 Enforcement(实施建议) Flag calls of virtual functions from constructors and destructors. 提示来自构造函数或析构函数的虚函数调用。 原文链接...
88.构造函数和析构函数可以调用虚函数吗,为什么? 1)在C++中,提倡不在构造函数和析构函数中调用虚函数;2)构造函数和析构函数调用虚函数时都不使用动态联编,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本;3)因为父类对象会在子类之前进行构造,此时子类部分的数据成员还...
这段代码来自《Effecitive C++》条款09,当声明一个BuyTransaction对象的时候,首先Transaction的构造函数会被调用,从而其virtual函数也被调动,这里就是引发惊奇的起点。这时候被调用的logTransaction是Transaction的版本,而不是派生类BuyTransaction的版本。 我们再看一段代码。
构造函数不可以,析构函数可以。 因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。 如果它的构造函数是虚函数,那就要通过对象中的虚函数表指针来调用,而这个虚函数表是在构造函数初始化列表阶段才初始化的。 463.在C中用const 能定义真正意义上的常量吗?C++中的const呢? const修饰的变量是只读的...
下面关于构造函数和析构函数的描述中,错误的是( )。 A) 析构函数可以声明为虚函数B) 对虚析构函数的调用可以采用动态联编C) 一个类的
构造函数可以说明为虚函数 C. 当基类的析构函数是虚函数时,它的派生类的析构函数也是虚函数 D. 析构函数调用虚函数采用动态联编 相关知识点: 试题来源: 解析 C.当基类的析构函数是虚函数时,它的派生类的析构函数也是虚函数 170)析构和构造调用虚函数是静态的,A、D项错误;析构函数可以是虚函数,但构造函...
A.析构函数中调用虚函数采用静态联编B.对虚析构函数的调用可以采用动态联编C.当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数D.构造函数可以声明为虚函数 2下列关于构造函数和析构函数的描述,错误的是( )。 A.析构函数中调用虚函数采用静态联编B.对虚析构函数的调用可以采用动态联编C.当基类...