zoukankan      html  css  js  c++  java
  • 什么函数不能声明为虚函数

     
     
    一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。 
    设置虚函数须注意: 
    1:只有类的成员函数才能说明为虚函数; 
    2:静态成员函数不能是虚函数; 
    3:内联函数不能为虚函数; 
    4:构造函数不能是虚函数; 
    5:析构函数可以是虚函数,而且通常声明为虚函数。
     
    类里面“定义”的成员函数是内联的,但是仍然可以成为虚函数,那么是不是可以说“内联函数不能成为虚函数”这句话有问题呢,是不是应该改成“显式定义的内联函数不能成为虚函数”。比如下面这个示例程序: 
    #include   <iostream> 
    using   namespace   std; 

    class   Base{ 
            public: 
            virtual     void   f1(){cout < < "Father " < <endl;} 
            }; 
    class   Drived1:public   Base{ 
            public: 
                void   f1(){cout < < "Son1 " < <endl;} 
            }; 
    class   Drived2:public   Base{ 
            public: 
                void   f1(){cout < < "Son2 " < <endl;} 
            }; 

    void   myPrint(Base*   pBs){ 
            pBs-> f1(); 
            } 
            
    int   main() 

        Base   father; 
        Drived1   son1; 
        Drived2   son2; 
        myPrint(&father); 
        myPrint(&son1); 
        myPrint(&son2); 
        
        system( "PAUSE ");
        return   0; 

    输出: 
    Father 
    Son1 
    Son2 

    你可以发现,虽然f1在基类中定义的,按理说应该是内联函数,但是它仍然可以成为虚函 
    数。
     
    类中定义的成员函数(函数体在类中)能成为虚函数,大部分编译器能够将虽然声明为inline但实际上不能inline的函数自动改为不inline的。至于编译器会不会将inline   and   virtual的函数照模照样的实现,与编译器及优化方式有关。
     
    要想成为虚函数,必须能够被取到地址.内联函数不能被取到地址所以不能成为虚函数. 

    你写inline   virtual   void   f(),不能保证函数f()一定是内联的,只能保证f()是虚函数(从而保证此函数一定不是内联函数) 

    对于问题: 
    到底内联函数能不能成为虚函数? 
    答案是不能.问题是你不能够确定一个函数到底是不是inline的.inlien关键字只是对编译器的一个建议:"如果有可能,请把此函数搞成inline的"
  • 相关阅读:
    JavaScript 数组操作函数--转载+格式整理
    Python之__str__类的特殊方法
    Django 模板层(Template)
    jquery基础
    Django基础(web框架)
    前端基础之JavaScript对象
    前端基础之JavaScript
    MySQL数据库之索引
    MySQL数据库之多表查询
    MySQL 数据库之单表查询
  • 原文地址:https://www.cnblogs.com/xiao-wei-wei/p/3356022.html
Copyright © 2011-2022 走看看