zoukankan      html  css  js  c++  java
  • 虚函数被类的构造析构函数和成员函数调用时

    通过代码来看

    #include<iostream>
    
    class base{
    public:
    
        base()
        {
            std::cout<<std::endl;
            std::cout<<"base constructor"<<std::endl;
            func1();
            std::cout<<std::endl;
        }
    
        virtual ~base()
        {
            std::cout<<std::endl;
            std::cout<<"base distructor"<<std::endl;
            func1();
            std::cout<<std::endl;
        }
        virtual void func1()
        {
            std::cout<<"base virtural func1"<<std::endl;
        }
    
        void func2()
        {
            std::cout<<"base member func2"<<std::endl;
            func1();
            std::cout<<std::endl;
        }
    };
    
    class derived:public base{
    public:
        derived()
        {
            std::cout<<std::endl;
            std::cout<<"derived constructor"<<std::endl;
            func1();
            std::cout<<std::endl;
        }
    
        virtual ~derived()
        {
            std::cout<<std::endl;
            std::cout<<"derived distructor"<<std::endl;
            func1();
            std::cout<<std::endl;
        }
    
        virtual void func1()
        {
            std::cout<<"derived virtual func1"<<std::endl;
        }
    
    };
    
    int main()
    {
        base *point = new derived();
        point->func2();
        delete point;
        return 0;
    }

    会有这样的输出

    即使func1是虚函数,在base类和derived的构造函数和析构函数里面,都是调用自己类里面的func1。

    而在普通成员函数func2调用func1,就会走虚函数的流程。

    ###########2014年1月新增############ 

    <<Effective C++>>

    条款9: 决不在构造和析构过程中调用virtual 函数  

  • 相关阅读:
    自动安装rpm依赖
    goroutine上下文contxt语法
    goroutine 上下文用法
    Template Method 模式
    设计模式2--设计原则
    centos7关机自动进行远程服务器备份
    实用工具使用
    剑指offer python版 滑动窗口的最大值
    剑指offer python版 左旋转字符串
    剑指offer python版 翻转单词顺序
  • 原文地址:https://www.cnblogs.com/yemsheng/p/2915222.html
Copyright © 2011-2022 走看看