继承与派生——两个程序的比较 2

来源:互联网 发布:c语言求1到n阶乘的和 编辑:程序博客网 时间:2024/05/17 01:50


/*
 *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没有任何瓜葛,加不加都不影响重载的运作。
0 0
原创粉丝点击