继承与派生——两个程序的比较 2
2016-06-15 18:49
363 查看
/*
*Copyright (c) 2016 烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:test.cpp
*作 者:史红浩
*完成日期:2016年 6 月 15 日
*问题描述:与上一篇博文作比较,转接我的博文
继承与派生——两个程序的比较
*版 本 号:v1.0
*/
运行结果:
![](http://img.blog.csdn.net/20160615184845157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如下面例子中的函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
(1) 重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2) 覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3) 覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。
/*
*Copyright (c) 2016 烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:test.cpp
*作 者:史红浩
*完成日期:2016年 6 月 15 日
*问题描述:与上一篇博文作比较,转接我的博文
继承与派生——两个程序的比较
*版 本 号:v1.0
*/
#include<iostream> using namespace std; class A { public: int n; }; class B:virtual public A{}; class C:virtual public A{}; class D:public B,public C { public: int getn() {return B::n;} }; int main() { D d; d.B::n=10; d.C::n=20; cout<<d.getn()<<endl; return 0; }
运行结果:
Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如下面例子中的函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
(1) 重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2) 覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3) 覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android Native 绘图方法
- Python动态类型的学习---引用的理解
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 一步一步跟我学易语言之第二个易程序菜单设计
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- C#与.net高级编程 C#的多态介绍
- C#中面向对象编程机制之多态学习笔记
- C#中struct和class的区别详解
- C#实现获取不同对象中名称相同属性的方法
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- javascript asp教程第十一课--Application 对象
- C#中的多态深入理解
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- C#中多态、重载、重写区别分析