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
c/c++ 继承与多态 静态调用与动态调用的更多相关文章
- 【VB技巧】VB静态调用与动态调用dll详解
本文“[VB技巧]VB静态调用与动态调用dll详解”,来自:Nuclear'Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=489,转载请注明作者及出处! [[请注意]]:在以下 ...
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- dll静态调用和动态调用
动态链接库有2种连接方式,一种是通过库直接加入(又叫隐式加载或载入时加载),一种是在运行时加入.后者很好理解,比如LoadLibrary(),GetProcAddress()获取想要引入的函数,使用完 ...
- java方法调用之动态调用多态(重写override)的实现原理——方法表(三)
上两篇篇博文讨论了java的重载(overload)与重写(override).静态分派与动态分派.这篇博文讨论下动态分派的实现方法,即多态override的实现原理. java方法调用之重载.重写的 ...
- DLL的静态调用和动态调用
// ------------------------------------DLL源代码 circle.dproj -------------------------------------libr ...
- C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用
1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图 ...
- Android与JNI(二) ---- Java调用C++ 动态调用
目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI( ...
- python基础——继承和多态
python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...
- python学习日记(继承和多态)
继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.S ...
随机推荐
- Python中的json模块
在Python内置函数中,有一个eval()函数可以将字符串内容转换成Python对象,比如我现在将一个字典 dic = {"name":"pengfy"}写到 ...
- TDD in .NET Core - 简介
本文很多内容来自选自TDD实例一书. 预备知识 最好有一些预备知识,例如xUnit,Moq,如何编写易于测试的代码,这些内容我都写了文章:https://www.cnblogs.com/cgzl/p/ ...
- 网络协议 10 - Socket 编程(上):实践是检验真理的唯一标准
系列文章传送门: 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 网 ...
- 厉害—Ansible管理windows集群
最近公司新项目需要安装400+windows server 2012系统的工作站,想着怎么能像linux下运用ansible批量管理,linux就很简单了有ssh服务 但是下却没这么简单,但还是有办法 ...
- C#版 - Leetcode 65. 有效数字 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...
- 2016年,总结篇 续 如何从 JQ 转到 VueJS 开发(一)
接着 2016 年的总结,我们来看看 2016年 国内最火且没有之一的前端MVVM 框架 VueJs 虽然 到写文章的这个时间点,VueJs已经发布了 2.1.x 了, 但是对于很多 Vuejs 的初 ...
- 将dylib库嵌入macOS应用的方法
写作是一种习惯,稍微松懈,也许失去的就很多.过了一个年,居然很多天都没有更新,幸福的代价吧:) 标题的问题其实以前碰到过,不过当时在iOS,所以随手处理了没有重视. 而这次是在macOS,所使用的库, ...
- org.springframework.core.io.ClassPathResource类
测试代码 package cn.edu.hdu.pichen.springexample; import java.io.BufferedReader; import java.io.IOExcept ...
- 《HelloGitHub月刊》第 04 期(秋招临近,本期加入了面试相关的项目)
兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个人能力有限,其他语言涉及甚少,欢迎各路人士加入, ...
- 使用mpvue开发小程序教程(四)
在上一章节中,我们将vue-cli命令行工具生成的代码骨架中的src目录清理了一遍,然后从头开始配置和编写了一个可以运行的小程序页面,算是正真走上了使用mpvue开发小程序的第一步.今天我们将进一步来 ...