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 函数  

  • 相关阅读:
    玩转Android状态栏
    自己制作 Android Vector Asset 矢量图
    android studio配置模拟器
    Android数据库使用指南(下)
    Android数据库使用指南(上)
    四种常见的 POST-------- content-type数据提交方式
    json格式化
    js删除cookie的方法
    js中box和box()的区别
    synchronized加static区别
  • 原文地址:https://www.cnblogs.com/yemsheng/p/2915222.html
Copyright © 2011-2022 走看看