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

原文地址:https://www.cnblogs.com/xiaoshiwang/p/10213452.html

时间: 2024-10-12 07:28:23

c/c++ 继承与多态 静态调用与动态调用的相关文章

C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll C#调用、动态调用

1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图所示, 也可以在本地IIS根据webservice文件目录新发布一个webservice,然后程序动态调用,修改Url public new string Url { set; get; } 2.根据wsdl文件生成webservice 的.cs文件 及 生成dll C#调用   有时没有这么多文件

Android与JNI(二) ---- Java调用C 动态调用(转载)

目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI(一)已经简单介绍了如何在 android  环境下使用 JNI 了.但是遵循 JNI 开发的基本步骤似乎有点死板,而且得到的

python 之继承和多态

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): print('Animal is running...') 当我们需要编写Dog和Cat类时,就可以直接从Anima

面向对象编程——继承和多态(四)

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). 比如我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): #为啥没有__init__,因为不需要初始化,就self一个参数. print("Animal is running.

动态调用WebService(C#) (非常实用)

前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 RESTful 架构风格的.但到目前为止,WebService 在一些Public Institution 中使用还是十分广泛的. 这里主要讨论一下关于WebService的调用问题.关于WebService 的调用分为静态调用和动态调用两种,外加直接Http请求方式 静态调用 静态调用的方式是通过“Add

C# WebService动态调用

C# WebService动态调用 前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 RESTful 架构风格的.但到目前为止,WebService 在一些Public Institution 中使用还是十分广泛的. 这里主要讨论一下关于WebService的调用问题.关于WebService 的调用分为静态调用和动态调用两种. 静态调用 静态调用的方式是

Delphi Dll 动态调用例子(3)-仔细看一下

http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ Delphi 动态链接库的动态和静态调用 为了让人能快速的理解 静态调用.动态调用,现在做一个函数封装在一个DLL中,然后在APPLICATION form里面调用这个函数,这个函数处理两个数的和.用代码和图片说话:代码如下 library Project1; { Important note about DLL memory management: ShareMe

c# 动态调用.net编写的webservices接口

c# 动态调用.net编写的webservices接口 创建类WebServiceHelper: public class WebServiceHelper { #region 动态调用WebService动态调用地址 /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="

Asp.Net 动态调用WebServices解决方案

放狗搜索动态调用webservices 的类,太多.问题挺纠结的.公司需要net调用java的webservices接口,蛋疼的是java端的接口,全部传入String类型的数据.蛋疼啊,接口你不编写成传递参数的形式就算了,尼玛,传递的对象是String(把xml格式化成string类型,在使用报文发送),返回也是String,我纳闷了.按照这个思路,Java端接收报文数据使用Object,返回Object,接口的兼容性岂不是提高了狠多?偏题了... 1.webservices动态类代码 usi