面向对象的三个基本特征

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

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

多态的实现:

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. java.lang.NoClassDefFoundError: antlr/ANTLRException

    在用Hibernate进行查询时,出现这样的错误:Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ ...

  2. Qt webkit插件相关知识

    1.在Qt中使用 WebKit 浏览器核心 使用 QtWebKit 需要在工程文件(*.pro)中加入: 1.           QT +=webkit   2.           QT += n ...

  3. hdu1595 dijkstra+枚举

    开始的时候想的比较简单,直接枚举所有输入的边,但最后超时:后来就先进行一次dij,记录所有最短路上的边,然后枚举删去这些边: #include<stdio.h> #include<s ...

  4. Java-clone浅/深复制

    Object中的clone方法为复制当前对象 protected native Object clone() throws CloneNotSupportedException; 想要使用这个方法需要 ...

  5. android 6.0 SDK中删除HttpClient的相关类的解决方法

    一.出现的情况 在eclipse或 android studio开发, 设置android SDK的编译版本为23时,且使用了httpClient相关类的库项目:如android-async-http ...

  6. BZOJ1034 [ZJOI2008]泡泡堂BNB

    Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表 队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对 ...

  7. The Longest Increasing Subsequence (LIS)

    传送门 The task is to find the length of the longest subsequence in a given array of integers such that ...

  8. CSS3系列三(与背景边框相关样式 、变形处理、动画效果)

    与背景相关的新增属性 大家都知道在HTML页面中,元素都是由以下几部分组成 使用background-clip来修改背景的显示范围,如果设定为border-box,则背景范围包含边框区域,如果设定为p ...

  9. squid 学习笔记

    Squid学习笔记 1.安装前的配置 编译安装之前需要校正的参数主要包括File Descriptor和Mbuf Clusters. 1.File Descriptor 查看文件描述符的限制数目: u ...

  10. WINDOWS渗透与提权总结(1)

    旁站路径问题: 1.读网站配置. 2.用以下VBS: 01 On Error Resume Next 02   03 If (LCase(Right(WScript.Fullname, 11)) = ...