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. C# new的用法

    在 C# 中,new 关键字可用作运算符.修饰符或约束. 1)new 运算符:用于创建对象和调用构造函数.这种大家都比较熟悉,没什么好说的了. 2)new 修饰符:在用作修饰符时,new 关键字可以显 ...

  2. 社区发现算法问题&&NetworkX&&Gephi

    在做东西的时候用到了社区发现,因此了解了一下有关社区发现的一些问题 1,社区发现算法 (1)SCAN:一种基于密度的社团发现算法 Paper: <SCAN: A Structural Clust ...

  3. python autopy

    今天学习了python autopy 主要包括alert,color,mouse,key,bitmap,screen等的操作 文档在http://www.autopy.org/documentatio ...

  4. iblog语法高亮示例

    -------------------------------------------------------------------------------------- iblog 是一款 Sub ...

  5. 这些年,我收集的JavaScript代码

    这些年,我收集的JavaScript代码(一) http://www.cnblogs.com/jscode/archive/2012/07/25/2605395.html 这些年,我收集的JavaSc ...

  6. ASP.NET MVC 学习第二天

    今天使用mvc完成简单的增删改,内容比较简单,来熟悉一下mvc,数据库操作是用前面的ef,也算是温习一下ef吧. 新建mvc项目,在项目中的Models内添加ef,我这里只操作一下简单的user表.里 ...

  7. Ubuntu 14.04 安装 Xilinx ISE 14.7 全过程

    生命在于折腾. 这个帖子作为我安装xilinx ISE 14.7版本一个记录.希望给需要的人一些帮助,这些内容绝大部分也是来源于互联网. 软硬件: lsb_release -a No LSB modu ...

  8. java性能优化策略

    1. 尽量使用局部变量代替成员变量,循环中对成员变量.方法的调用不超过2次 2. ArrayList如果知道大小,初始化时应指明 3. HashMap的遍历,用Entry 4. 如果确定类不可继承尽量 ...

  9. QT模态弹出对话框

    QDialog QWidget 默认show()都是非模态 如果需要模态显示, QDialog ==> setModal(true); show(); exec(); QWidget ==> ...

  10. struts2多文件上传(带进度条)demo+说明

    利用plupload插件实现多文件上传,实现图片: 在jsp写入js代码: z<%@ page language="java" contentType="text/ ...