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. iblog语法高亮示例

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

  2. Redis集群明细文档

    Redis目前版本是没有提供集群功能的,如果要实现多台Redis同时提供服务只能通过客户端自身去实现(Memchached也是客户端实现分布式).目前根据文档已经看到Redis正在开发集群功能,其中一 ...

  3. 数据的增量更新之EXISTS

    有时候需要实现是数据的增量更新,因为更新全量会带来时间跟数据库资源的浪费,还有可能是数据出现冗余,所以需要使用增量数据同步,下面是一个数据增量同步的小实例. ---drop table A CREAT ...

  4. ThinkPHP/Common/extend.php

    <?php // +---------------------------------------------------------------------- // | ThinkPHP [ ...

  5. c# this.location和e.X的区别

    this.location是窗口当前位置 e.X是具体事件的相对坐标 size是窗口尺寸宽和高

  6. iOS常见问题(5)

    一.注意将之前storyboard中控制器删除之后,拖入一个新的控制器的时候,stroyboard中控制器的class也要重新填入自己想要展示的控制器,告诉stroyboard去加载哪个控制器. 二. ...

  7. nodejs小问题:express不是内部或外部命令(转载)

    安装express之后发现居然提示express不是内部或外部命令. 工具/原料 Node.js安装包 方法/步骤 1 首先下载Node.js安装包,此处我用的是官方最新的v0.10.27 32位版: ...

  8. 【BestCoder】【Round#29】

    T1 啊……a^b 与 c^d比较大小,我们可以两边取对数,转化成 log(a^b)=b*log(a) 和d*log(c) 这样就能直接算了……然后稍微搞一下精度什么的就A了=.= //BC #29 ...

  9. 剑指offer--面试题11

    题目:求数值的整数次方,不考虑大数值情况 即实现函数:double Power(double base, int exponent) 自己所写代码如下: #include "stdafx.h ...

  10. GridView 服务端控件添加 js

    针对服务端控件的 CommandField “Delete” 添加 js $("#GridView1").find("a").each( function() ...