5.4虚函数
5.4.1 虚函数的引入
//例5.19 虚函数的引例

#include<iostream>
using namespace std;
class MyBase{ //声明基类
public:
MyBase(int x,int y) //基类的构造函数
{
a = x;
b = y;
}
void show() //基类的show方法
{
cout<<"调用基类MyBase的show()函数\n";
cout<<"a="<<a<<","<<"b="<<b<<endl;
}
private:
int a,b;
};
class MyDerived:public MyBase{ //基类的公有派生类
public:
MyDerived(int x,int y,int z):MyBase(x,y) //派生类构造函数
{c=z;}
void show() //派生类的show方法
{
cout<<"调用派生类MyDerived的show()函数\n";
cout<<"c="<<c<<endl;
}
/*
void print()
{
cout<<"派生类中自定义的成员函数:"<<endl;
}
*/
private:
int c;
};
int main()
{
MyBase mb(,),*mp; //定义基类对象mb和对象指针mp
MyDerived md(,,); //定义派生类对象md
mp = &mb; //对象指针mp指向基类对象mb
mp->show();
mp = &md; //对象指针mp指向派生类对象md
mp->show();
//mp->print();// error: 'class MyBase' has no member named 'print'
return ;
}
/*
运行结果是:调用基类MyBase的show()函数
a=50,b=50
调用基类MyBase的show()函数
a=10,b=20 结果发现:基类的对象指针可以指向它的公有派生类的对象,但是当其指向公有派生类对象时,
它只能访问派生类中从基类继承来的成员,而不能访问公有派生类中定义的成员。
可是,如果将将函数声明为虚函数,就可以访问了。
*/

//例5.19 虚函数的引入

using namespace std;
class MyBase{ //声明基类
public:
MyBase(int x,int y) //基类的构造函数
{
a = x;
b = y;
}
virtual void show() //基类的show方法,基类中虚函数
{
cout<<"调用基类MyBase的show()函数\n";
cout<<"a="<<a<<","<<"b="<<b<<endl;
}
private:
int a,b;
};
class MyDerived:public MyBase{ //基类的公有派生类
public:
MyDerived(int x,int y,int z):MyBase(x,y) //派生类构造函数
{c=z;}
virtual void show() //派生类的show方法,派生类中虚函数
{
cout<<"调用派生类MyDerived的show()函数\n";
cout<<"c="<<c<<endl;
}
private:
int c;
};
int main()
{
MyBase mb(,),*mp; //定义基类对象mb和对象指针mp
MyDerived md(,,); //定义派生类对象md mp = &mb; //对象指针mp指向基类对象mb
mp->show();
mp = &md; //对象指针mp指向派生类对象md
mp->show(); return ;
}
/*
运行结果:
调用基类MyBase的show()函数
a=50,b=50
调用派生类MyDerived的show()函数
c=30 为什么把基类的中的show函数定义为虚函数时,程序的运行结果就正确了呢?这是因为,
关键字virtiual指示C++编译器,函数调用my->show()要在运行时确定所要调用的函数,即
要对该调用进行联编。因此,程序在运行时根据指针mp所指向的实际对象,调用该对象的
成员函数。
我们把使用同一种调用形式"mp->show()“,调用同一类族中不同类中的虚函数称之为动态
的多态性,即运行时的多态性。可见,C++支持运行时的多态性。
*/

C++:虚函数的引入的更多相关文章

  1. C++ 系列:虚函数

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  2. C++ Primer--虚函数与纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  3. C++中虚函数的作用

    一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Po ...

  4. C++中虚函数的作用是什么?它应该怎么用呢?

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  5. C++中虚函数和纯虚函数的区别与总结

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  6. C++(九)— 虚函数、纯虚函数、虚析构函数

    1.虚函数 原因:通过指针调用成员函数时,只能访问到基类的同名成员函数.在同名覆盖现象中,通过某个类的对象(指针及引用)调用同名函数,编译器会将该调用静态联编到该类的同名函数,也就是说,通过基类对象指 ...

  7. C++: 多态 虚函数

    一.多态: 1.多态是什么:具有不同功能的函数可以用同一个函数名 2.静态多态:程序编译时决定,通过函数重载实现. 3.动态多态:程序运行时决定,通过虚函数实现. 二.虚函数: 1.引入目的:可以通过 ...

  8. c++中虚函数与纯虚函数的区别(转)

    首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数.定义他为虚函数是为了允许用基类的指针来调用子类的这个函数.定义一个函数为纯虚函数,才代表函数没有被实现.定义纯虚函数是为了实现一个接 ...

  9. C++ 虚函数与纯虚函数 浅析

    [摘要] 在虚函数与纯虚函数的学习中.要求理解虚函数与纯虚函数的定义,了解虚函数与纯虚函数在实例化上的差异.掌握两者在实现上的必要性.熟悉纯虚函数在子类与孙类的函数类型.本文即针对上述问题展开阐述. ...

随机推荐

  1. JQuery解析JSon

    JsonCreatet.ashx页面 JSonAnalysis.aspx测试页面 一般处理程序中使用Newtonsoft.Json来序列化json 页面使用Jquery 来解析Json数据 Jquer ...

  2. python 数字、字符串、列表常用函数

    一.数字的标准类型: cmp():比较两个数的大小:返回值(-1,0,1). str():数字转化成字符串. type():返回数字类型. 转换工厂函数: int(obj,base=10) long( ...

  3. .Net码农学Android---系统架构和基本概念

    至此,你应该已经完成以下前期准备事情: 1.安装完JDK 2.安装完SDK(并在Manager中进行相关版本的更新) 3.相关IDE(如eclipse) 4.安装完ADT 5.安装完AVD(如果你是真 ...

  4. [JAVA][RCP]Clean project之后报错:java.lang.RuntimeException: No application id has been found.

    Clean了一下Project,然后就报了如下错误 !ENTRY com.release.nattable.well_analysis 2 0 2015-11-20 17:04:44.609 !MES ...

  5. Android开发笔记一(hello world)

    UI: <Button android:layout_width="wrap_content" android:layout_height="wrap_conten ...

  6. 路由器开发板上的TTL线连接方法

    手头有个MTK双频路由器的开发板,做工良好,但让人蛋疼的是,TTL线没有标注TX/RX/GND/VCC,这个小细节的缺失给使用带来了巨大麻烦.   网上搜了半天也没找到相关电路图,只好遍历测试找到正确 ...

  7. 复习JS和jQuery

    复习JS和jQuery 近些时日,以前学过的东西忘了好多.今天且写一点复习一下JS和jQuery.希冀与某年某月某日,忘却的时候,能看一下自己写的博文,尚可记起一二. 现在有需求如下:有两个按钮,一个 ...

  8. maven工程的如何进行代码调试

    1.maven项目的父项目右键选择:maven build    注意:       1.选择Browser workspace,让BaseDirectory变成:${***}形式.       2. ...

  9. EXT--表单AJax提交后台,返回前端数据格式的转换

    前言: 前端发送请求至服务端(Java),得到的数据是Java语言对象所表现的形式,经常需要转换为JSON格式的字符串写出至前端:当前端获取后也往往需要将字符串转换为js的对象.本文描述了在EXT作为 ...

  10. execvp使用实例

    问题描述:           本程序实现模拟shell功能,用户输入命令,返回相应的结果 问题解决: 注:        以上指出了execvp函数的使用,使用时第一个参数是文件名,第二个参数是一个 ...