面向对象的三个基本特征

面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!

多态: 为了使同一方法在基类和派生类中的实现可以不同。

多态的实现:

1、在派生类中重新定义基类的方法

2、使用虚方法

如果要在派生类中重新定义基类的方法,通常将基类方法声明为虚方法

如果方法是通过引用或指针调用而不是对象直接调用,使用哪一种方法将有两种情况:

1、如果在基类中没有将方法声明为virtual函数,则将根据引用或指针的类型选择使用哪一种方法

如:

//BassPlus是Bass的派生类

//ViewAcct()是非虚函数

Barss dom("Dominic" , 1124, 432.45);

BassPlus dot("Dorothy", 11234, 345.00);

Barss & b1_ref=dom;

Barss & b2_ref=dot;

b1_ref.ViewAcct();     //use  Barss::ViewAcct()

b2_ref.ViewAcct();    //use  Barss::ViewAcct()

由于  ViewAcct()为非虚函数,因此将根据引用的类型而不是其所指的对象的类型确定所调用的方法。使用Brass指针替换引用,得到的效果相同

2、如果在基类中将方法声明为virtual函数,则将根据引用或指针所指对象的类型选择使用哪一种方法

//BassPlus是Bass的派生类

//ViewAcct()是虚函数

Barss dom("Dominic" , 1124, 432.45);

BassPlus dot("Dorothy", 11234, 345.00);

Barss & b1_ref=dom;

Barss & b2_ref=dot;

b1_ref.ViewAcct();     //use  Barss::ViewAcct()

b2_ref.ViewAcct();    //use  BarssPlus::ViewAcct()

由于  ViewAcct()为虚函数,因此将根据引用所指对象的类型确定所调用的方法。b1_ref所指的对象为Barss,b2_ref所指的对象为BarssPlus。使用Brass指针替换引用,得到的效果相同

例子:(2012某**软件公司笔试题)

请按顺序写出下面代码的输出结果:

答案:call child func

call ~child

call ~base

方法在基类中被声明为virtual后,在基类中会自动生成为virtual方法,但通常还是会在派生类中使用virtual关键字

参考:

C++封装、继承、多态 - ruyue_ruyue的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/ruyue_ruyue/article/details/8211809

浅谈C++多态性 - Hackbuteer1的专栏 - 博客频道 - CSDN.NET  http://blog.csdn.net/hackbuteer1/article/details/7475622

C++多态公有继承的更多相关文章

  1. C++_类继承2-多态公有继承

    有时候希望同一个方法在派生类和基类中的行为是不同的.换句话说,方法的行为取决于调用该方法的对象.这种较复杂的行为称为多态——具有多种形态.即同一种方法其行为随上下文而异.有两种重要的机制可用于实现多态 ...

  2. 深入理解OOP(四): 多态和继承(抽象类)

    在本文中,我们讨论OOP中的热点之一:抽象类.抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样.本文中我们会通过代码来实现抽象类,并一一进行解析. 深入理解OOP(一):多态和继承(初期绑定 ...

  3. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...

  4. 深入理解OOP(二):多态和继承(继承)

    本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...

  5. 深入理解OOP(第一天):多态和继承(初期绑定和编译时多态)

    在本系列中,我们以CodeProject上比较火的OOP系列博客为主,进行OOP深入浅出展现. 无论作为软件设计的高手.或者菜鸟,对于架构设计而言,均需要多次重构.取舍,以有利于整个软件项目的健康构建 ...

  6. C++公有继承

    is-a.has-a和like-a.组合.聚合和继承 两组概念的区别 - cbk861110的专栏 - 博客频道 -CSDN.NET http://blog.csdn.net/cbk861110/ar ...

  7. C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)

    各种继承方式: 特征 公有继承 保护继承 私有继承 公有成员变为 派生类的公有成员 派生类的保护成员 派生类的私有成员 保护成员变为 派生类的保护成员 派生类的保护成员 派生类的私有成员 私有成员变为 ...

  8. C++ 中私有继承、保护继承与公有继承

    区别 下面通过一个示例来介绍三种继承的区别. 定义一个基类(假设为一个快退休的富豪): class RichMan { public: RichMan(); ~RichMan(); int m_com ...

  9. C++进阶--公有继承的二元性

    //########################################################################### /* * 公有继承的两元性 * * - 接口 ...

随机推荐

  1. IntellJ IDEA 所有快捷键

    登录下面网站. http://www.jetbrains.com/idea/documentation/ 下载Keymap for Windows/Linux 后面的PDF文档.

  2. codevs 1690 开关灯 线段树水题

    没什么好说的,标记put表示开关是否开着. #include<cstdio> #include<cstring> #include<algorithm> using ...

  3. Java-maven异常-cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突

    使用maven开发web应用程序, 启动的时候报错: jar not loaded. See Servlet Spec . Offending class: javax/servlet/Servlet ...

  4. BZOJ2818 欧拉函数

    题意:求1--n中满足gcd(x,y)的值为质数的数对(x,y)的数目 ( (x,y)和(y,x)算两个 ) sol: 设p[i]是一个质数,那么以下两个命题是等价的: 1.gcd(x,y)=1 2. ...

  5. [NOIP2011] 提高组 洛谷P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  6. jsp学习(五)

    在进行jsp与jdbc连接时,出现这样一个错误,提示如下: java.net.ConnectException: Connection refused: connect 后来发现是由于mysql数据库 ...

  7. 求DAG上两点的最短距离

    Problem 给出一个不带边权(即边权为1)的有向无环图(unweighted DAG)以及DAG上两点s, t,求s到t的最短距离,如果无法从s走到t,则输出-1. Solution DFS,BF ...

  8. ExtJS入门教程02,form也可以很优雅

    在上一篇<Extjs window 入门>中,我们已经看到了如何将一个form组件放到window中,今天我们来看看form的一些优雅的工作方式. 使用fieldDefaults,优雅的设 ...

  9. [Redis]c# redis缓存辅助类

    public static class RedisCache { private static IRedisClient RCClient = null; /// <summary> // ...

  10. [Angularjs]angular ng-repeat与js特效加载先后导致的问题

    写在前面 最近在项目中遇到这样的一个前端的bug,在ng-repeat中绑定的图片,有一个晃动的特效,在手机端浏览的时候,图片有时候会正常展示,有时就展示不出来.当时猜测是因为angularjs与特效 ...