欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 继承与多态 静态调用与动态调用

程序员文章站 2023-04-05 16:36:55
静态调用,与动态调用。 动态调用条件:必须用父类的引用或者指针,并且调用的必须是虚方法。 运行结果: c/c++ 学习互助QQ群:877684253 本人微信:xiaoshitou5854 ......

静态调用,与动态调用。

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

#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

c/c++ 继承与多态 静态调用与动态调用

本人微信:xiaoshitou5854