Effective C++ 条款09 决不在构造和析构过程后调用虚函数

1.C++的继承体系中,最底层的派生类的构造过程中,最先初始化的是基类部分,再按继承层次依次初始化派生类部分,同样的,析构过程则是按相反过程执行。在继承层次A→B→C→D中,构造一个D类对象,其依次经历了A→B→C→D的转变,因此对于以下代码。所以,在这个过程中基类构造过程中,基类尚在构造,派生类对象中也就只存在继承而来的基类部分,调用虚函数这类的调用从不下降至derived class

//
//  main.cpp
//  条款10
//
//  Created by yulei on 2018/8/24.
//  Copyright © 2018 yulei. All rights reserved.
//

#include <iostream>
using namespace std;
class A{
public:
    virtual void foo(){ cout << "A" << endl; }
    A(){ foo(); }
};
class B :public A{
public:
    void foo(){ cout << "B" << endl; }
    B(){ foo(); }
};
class C :public B{
public:
    void foo(){ cout << "C" << endl; }
    C(){ foo(); }
};
class D :public C{
public:
    void foo(){ cout << "D" << endl; }
    D(){ foo(); }
};
int main(int argc, const char * argv[]) {
     D d;
    return 0;
}

可见,在构造函数中调用虚函数,不仅不能如愿调用底层派生类的虚函数,还会依次调用整个继承层次的虚函数.这就是不在构造过程中调用虚函数的原因,除此之外涉及到RTTI(Run-Time Type Information,运行时类型识别)时也会把对象按构造顺序依次视为A→B→C→D.

2. 在A→B→C→D这个继承体系中,如果对一个D类对象调用析构函数,会依次调用D,C,B,A的析构函数,对象也依次经历了D→C→B→A的转变,同理,不要在析构函数中调用虚函数.

3. 如果确实需要在构造函数中调用由类型确定的函数,可以”令derived classes将必要的构造信息向上传递至base class构造函数“替换虚函数的使用,例如:

#include <iostream>
using namespace std;
class A{
public:
    void foo(){ cout << "A" << endl; }
    A(char ch='a'){ if(ch=='a') foo(); }
};
class B :public A{
public:
    void foo(){ cout << "B" << endl; }
    B(char ch = 'b') :A(ch){ if (ch == 'b') foo(); }
};
class C :public B{
public:
    void foo(){ cout << "C" << endl; }
    C(char ch = 'c') :B(ch){ if (ch == 'c') foo(); }
};
class D :public C{
public:
    void foo(){ cout << "D" << endl; }
    D():C('d'){ foo(); }
};

这样就可以确保调用合适的构造函数.

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值