C++学习笔记之继承层次中的函数调用。
来源:互联网 发布:管家婆软件打印机设置 编辑:程序博客网 时间:2024/05/30 04:58
不妨将继承层次中的函数调用按照调用方式分类:
一、直接通过对象调用:
1、调用非虚函数。众所周知,一个派生类对象(public继承)是有两部分组成的,基类对象部分和派生类自己的部分,如果用派生类对象调用某一非虚函数(假设该函数在基类中为public)nvfcn() , 则编译器首先在派生类部分中查找该函数名字:若找到,则进行类型检查,检查正确-->调用、不正确-->报错;若找不到,则到基类中查找。。以此类推。例如:
class BaseClass{public:BaseClass(){};~BaseClass(){};void nvfcn(){cout << "基类"<< endl;}};class DerivedClass : public BaseClass{public:DerivedClass(){}~DerivedClass(){};void nvfcn( ){cout << "派生类"<< endl;}};
DerivedClass dc;dc.nvfcn();//结果为 派生类//若将派生类中的nvfcn()函数改为nvfcn(int a) 则会报错那么为什么会报错?不应该在基类中找得到么?因为派生类的作用域是在基类的作用域之内的(函数的参数列表不同,这样区分不同的函数。它们在编译后就自动变成两个不同的函数名,有两个不用的地址)派生类的函数已经将基类中的同名函数屏蔽掉了!
如果把派生类中的函数注释掉,则会调用基类的函数。
2、虚函数也是如此。
二、通过基类的指针或者引用调用:
1、调用虚函数。通过基类的引用或者指针调用虚成员,是动态绑定的,调用基类还是派生类的函数是运行时候确定的(根据对象的实际类型),不是根据指针或者引用的静态类型。(在程序运行前不知道,会调用那个方法,而到运行时通过运算程序,动态的算出被调用的地址)。
class BaseClass{public:BaseClass(){};~BaseClass(){};virtual void vfcn(){cout << "Base:" << endl;}void nvfcn(){cout << "基类"<< endl;}};class DerivedClass : public BaseClass{public:DerivedClass(){}~DerivedClass(){};void vfcn(){cout << "Derived : " << endl;}void nvfcn(){cout << "派生类"<< endl;}};
BaseClass bc;DerivedClass dc;BaseClass * bp = &dc;bp->vfcn();结果为派生类
2、非虚函数。非虚函数总是在编译时根据调用该函数的对象、引用或指针的类型确定,无论运行时实际对象是什么类型的,调用该对象的非虚函数都将会调用基类中定义的版本。
BaseClass bc;DerivedClass dc;BaseClass * bp = &dc;bp->vfcn();bp->nvfcn();//显示基类
(以上为菜鸟看书之后的小总结,不知对不对,热烈欢迎批评指正!!不胜感激)
- C++学习笔记之继承层次中的函数调用。
- 如何确定C++继承层次中的函数调用
- C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型
- 继承层次中的函数重载问题
- scala学习笔记之 scala多重继承中的混入顺序和对象调用顺序说明
- C学习笔记之函数
- c#继承中的函数调用
- v8学习笔记(一) 调用层次
- VC++学习笔记之函数调用约定
- C++学习笔记48——继承中的构造函数
- Java基础学习笔记--继承中的构造函数
- C++学习笔记--继承中的同名变量和同名函数
- Netty4学习笔记(5)-- NioEventLoopGroup继承层次结构
- Netty4学习笔记(6)-- NioEventLoop继承层次结构
- Netty4学习笔记(5)-- NioEventLoopGroup继承层次结构
- Netty4学习笔记(5)-- NioEventLoopGroup继承层次结构
- Netty4学习笔记(6)-- NioEventLoop继承层次结构
- CSS3学习笔记 之 层次选择器
- 苹果面试8大难题及答案
- Emacs:神的编辑器还是人的编辑器?
- 2012-10-14 ant工具的使用
- 使用SWT Designer做可视化开发
- HDU 4119 Isabella's Message(模拟)
- C++学习笔记之继承层次中的函数调用。
- Eclipse 3.6 中安装WindowBuilder Pro及使用SWT Designer
- 题目:Easier Done Than Said?
- 你的梦想,是复制别人吗
- 美媒称中日副外长将会晤预示两国寻求缓解对抗-钓鱼岛-反日示威-反日
- 重拾C++经典笔试30题(21-30)
- Eclipse 插件开发遇到问题心得总结
- AxmlParserPY对framework-res.apk反编译失败的修正
- 平均要取多少个(0,1)中的随机数才能让和超过1