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. Microsoft Access Database Engine 2010 Redistributable Download

    SQL Server 如需要导出类似Excel(*.xls.*.xlsx)格式的数据需要以来以下安装包 Microsoft Access 2010 数据库引擎可再发行程序包 此下载将安装一系列组件,帮 ...

  2. [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(一)

    内容较多,开篇作为说明和目录. 实验环境规划:服务器:IBM x3500 m3三台其中两台用作HA,另外一台安装VMware ESXi安装两个虚机做Stream Replication.NAS存储IP ...

  3. 微软职位内部推荐-Enterprise Architect - BDE - BJ

    微软近期Open的职位: Enterprise ArchitectCloud, HTML5, Big Data and Mobile are technology trends driving pro ...

  4. textview点击后selector的pressed无效果

    原因: 需要配置  android:clickable="true" 这个跟开发环境有关,我之前用的android studio 就不需要这一项,默认可以点击. ********* ...

  5. Luence简单实现1

    初步认识Luence,简单按照官方文档做了个例子,大牛绕开,仅供小白路过参考.如有错误,欢迎指正批评. 建一个简单工程,并且加入这几个小奶瓶,如下图: 注:版本不同,可能对jdk的需求是不同的,这个需 ...

  6. C++实现简单的内存池

    多进程编程多用在并发服务器的编写上,当收到一个请求时,服务器新建一个进程处理请求,同时继续监听.为了提高响应速度,服务器采用进程池的方法,在初始化阶段创建一个进程池,池中有许多预创建的进程,当请求到达 ...

  7. Ext学习-布局介绍

    1.目标    了解ExtJS中的关于布局和组建的相关原理,并学习相关的布局方式 2.内容   1.布局和组件的相关原理   2.常见的布局方式 3.学习流程    1.首先应该学习一下布局和组件的相 ...

  8. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  9. WinForm点击按钮在对应的panel里画图

    panel在form1里,button在form1上方,panel在下面. 主要是在button1的click时间获取panel的画笔. 下面的不行,在panel里获取画笔,然后传到button1,根 ...

  10. 2-Highcharts曲线图之折线图

    示例图片,在网上下载一张图片如图:其中数据自定义 引入上节模版配置  在script标签中写代码:具体代码如下   信息将在代码中解释. 分析:“五省收益趋势”是标题: x坐标为[2011年-2016 ...