zoukankan      html  css  js  c++  java
  • C++虚函数与纯虚函数用法与区别(转载)

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)

      

    2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。

     

    3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。

     

    4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。

     

    5. 虚函数的定义形式:virtual {method body}

      纯虚函数的定义形式:virtual { } = 0;

    在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。

     

    6. 虚函数必须实现,如果不实现,编译器将报错,错误提示为:

    error LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"

     

    7. 对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。

     

    8. 实现了纯虚函数的子类,该纯虚函数在子类中就变成了虚函数,子类的子类即孙子类可以覆盖

    该虚函数,由多态方式调用的时候动态绑定。

     

    9. 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的

    函数

     

    10. 多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。

    a.编译时多态性:通过重载函数实现

    运行时多态性:通过虚函数实现。

     

    11. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。

     

    //father class
    
      class Virtualbase
    
      {
    
      public:
    
      virtual void Demon()= 0; //prue virtual function
    
      virtual void Base() {cout<<"this is farther class"<};
    
      }
    
      //sub class
    
      class SubVirtual :public Virtualbase
    
      {
    
      public:
    
      void Demon() { cout<<" this is SubVirtual!"< 
    
      void Base() { cout<<"this is subclass Base"< 
    
      }
    
      /*
    
      instance class and sample
    
      */
    
      void main()
    
      {
    
      Virtualbase* inst = new SubVirtual(); //multstate pointer
    
      inst->Demon();
    
      inst->Base();
    
      // inst = new Virtualbase();
    
      // inst->Base()
    
      return ;
    
    }
    

     下文详细讲了虚函数的底层实现
    http://blog.csdn.net/wuchuanpingstone/article/details/6742465

     

  • 相关阅读:
    Python十大经典算法之选择排序
    在js中修改样式带 !important 的样式
    vscode 使用 ejs 语法有红色错误提示线
    mysql 报 'Host ‘XXXXXX’ is blocked because of many connection errors'
    字符编码
    Canal.adapter报错
    Windows 域控配置时间同步
    Docker清理日志脚本
    Docker快速部署clickhouse
    Windows批处理一键添加hosts文件
  • 原文地址:https://www.cnblogs.com/xiaobiexi/p/3287537.html
Copyright © 2011-2022 走看看