zoukankan      html  css  js  c++  java
  • c/c++ 继承与多态 静态调用与动态调用

    静态调用,与动态调用。

    动态调用条件:必须用父类的引用或者指针,并且调用的必须是虚方法。

    #include <iostream>
    
    class Base{
    public:
      virtual int fcn(){
        std::cout << "base fcn()" << std::endl;
      }
    };
    
    class D1 : public Base{
      
    public:
      using Base::fcn;
      int fcn(int){//形参与Base的fcn不一致,所以隐藏了Base的fcn
        std::cout << "D1 fcn(int)" << std::endl;
      }
      virtual void f2(){
        std::cout << "D1 f2()" << std::endl;
      }
    };
    
    class D2 : public D1{
    public:
      int fcn(int){//隐藏了D1::fcn(int)
        std::cout << "D2 fcn(int)" << std::endl;
      }
      int fcn(){//覆盖了Base的虚函数fcn
        std::cout << "D2 fcn()" << std::endl;
      }
      void f2(){//覆盖了D1的虚函数f2
        std::cout << "D2 f2()" << std::endl;
      }
    };
    
    int main(){
      Base b;
      D1 d1;
      D2 d2;
    
      d1.fcn();
    
      Base* bp1 = &b;
      Base* bp2 = &d1;
      Base* bp3 = &d2;
    
      bp1->fcn();//调用虚函数,将在运行时调用Base::fcn
      bp2->fcn();//调用虚函数,将在运行时调用Base::fcn
      bp3->fcn();//调用虚函数,将在运行时调用D2::fcn
    
      D1* d1p = &d1;
      D1* d2p = &d2;
    
      //bp2->f2();//‘class Base’ has no member named ‘f2’
      d1p->f2();//调用虚函数,将在运行时调用D1::f2
      d2p->f2();//调用虚函数,将在运行时调用D2::f2
    
      Base* p1 = &d2;
      D1*   p2 = &d2;
      D2*   p3 = &d2;
      //p1->fcn(12);//error
      p2->fcn(12);//静态调用,调用D1::fcn(int)
      p3->fcn(12);//静态调用,调用D2::fcn(int)
     
    }
    
    

    运行结果:

    base fcn()
    base fcn()
    base fcn()
    D2 fcn()
    D1 f2()
    D2 f2()
    D1 fcn(int)
    D2 fcn(int)
    

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    sqlilab less19-less22
    sqlilab less11-less18
    逆向——序列号相关总结
    xctf攻防世界——crackme writeup
    ESP定律脱壳——NsPack3.x脱壳
    避免全局变量漫天飞
    C语言实现队列
    STM32中的C语言知识点
    超时事件时间戳
    STM32-电源控制、低功耗模式
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10213452.html
Copyright © 2011-2022 走看看