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

  • 相关阅读:
    EasyUI--Alert()
    asp.net 页面之间传值的几种方式
    c# 的类成员
    c# protected public private internal
    C#中的多态性
    c# 静态成员和实例成员的区别
    js确认框confirm()用法实例详解
    JS中的switch case
    分分钟用上C#中的委托和事件
    Asp.net MVC中关于@Html标签Label、Editor使用
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10213452.html
Copyright © 2011-2022 走看看