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. Freemarker例子

    1.引入架包 2.写ftl文件 3.代码 hello.ftl 你好啊,${hello},今天你的精神不错! if else 语句测试 <#if num gt 18><#-- 不使用 ...

  2. Oracle varchar2 4000

    关于oracle varchar2 官方文档的描述 VARCHAR2 Data Type The VARCHAR2 data type specifies a variable-length char ...

  3. 进程和cpu绑定

    #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<sys/sysinfo ...

  4. 解决VS2012新建MVC3等项目时,收到加载程序集“NuGet.VisualStudio.Interop…”的错误

    vs2012来做一个mvc3的项目,哪知在创建ado数据模型时跳出这么一个东东 错 误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0 ...

  5. 序列化form表单内容为json对象

    SourceCode: ; (function ($) { $.fn.extend({ serializeJson: function () { var json = {}; $(this.seria ...

  6. C# list 筛选FindAll,根据参数过滤

    /// <summary> /// 汽车车型 获取 /// Redis Key=zgqp315_Redis_ModelNumberC_List /// </summary> / ...

  7. ServiceStack.OrmLite 调用存储过程

    最近在做关于ServiceStack.OrmLite调用存储过程时,有问题.发现ServiceStack.OrmLite不能调用存储过程,或者说不能实现我想要的需求.在做分页查询时,我需要传入参数传出 ...

  8. UI控件tag属性和魔法数字的处理

    说明:tag属性有很大的用处,它就好像每个UI控件的id,当多个按钮指向同一个监听方法时,可以给方法带参数UIButton,然后根据不同的tag值 来判断执行哪个按钮的监听事件: - (IBActio ...

  9. Opencv图像与矩阵的操作

    #include "stdafx.h" #include <cv.h> #include <cxcore.h> #include <highgui.h ...

  10. php输出错误屏蔽的函数

    /** * 设置默认值方法 * @param mult $data * @param string $key key值 * @param string $default 默认值 */ public s ...