C++多态公有继承

面向对象的三个基本特征

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

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

多态的实现:

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

时间: 2024-10-05 08:38:31

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

多态公有继承

多态公有继承:所谓多态公有继承,就是同一个方法在派生类和基类中的行为不同. 实现多态公有继承的机制:1,在派生类重新定义基类的方法.(用于对象)2,使用虚方法(多用于指针和引用),虚方法在基类用关键字virtual声明,在派生类中会自动识别基类中声明的虚方法.所以,在派生类中可以用(也可以不用)virtual显式标出哪个方法是虚方法.通俗来讲:为了实现一种方法可以在派生类和基类中的行为不同,于是在派生类中重新定义基类函数的方法(比如基类有方法A, 但又在派生类中重新定义了方法A, 它们名字一样,

浅谈C++非多态单继承数据布局

最近在看<深度探索C++对象模型>,打算先总结下C++中的数据布局,这篇暂时先谈谈非多态(non-polymorphic)单继承的情况: 一般而言,当我们谈及C++中的继承和多态就默认进入到其面向对象的语境中了.封装是基础,公有继承(public)是手段,然后带来运行时多态(run-time polymorphism)的弹性,通过“基类指针或引用可以透明的指向任何派生类对象”这句话来支撑着C++的面向对象体系.目的无他,无非是简化用户(这里的用户指的是类的使用者)的使用逻辑,即归一化.归一化说

C++公有继承,私有继承和保护继承的区别

昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些名字里面有abstract的). 基类也叫父类,虽然本人觉得这个比喻并不恰当.因为实际上子类是基类的扩充,描述了更加具体的东西.但现实的父子关系并非如此.但在有些方面这个比喻还是比较恰当的. 现在我们假设基类是一个快要退休的富豪.代码如下: class RichMan { public: RichM

七:Java之封装、抽象、多态和继承

本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员. 在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sle

C++公有继承

is-a.has-a和like-a.组合.聚合和继承 两组概念的区别 - cbk861110的专栏 - 博客频道 -CSDN.NET http://blog.csdn.net/cbk861110/article/details/9028189 公有继承强调的是is-a的关系,强调的是一种继承关系,而has-a强调的是一种从属关系. 继承的形式为:  class  derived:public  based 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的

深入浅出OOP(四): 多态和继承(抽象类)

在本文中,我们讨论OOP中的热点之一:抽象类.抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样.本文中我们会通过代码来实现抽象类,并一一进行解析. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Cons

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

本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Constants/Static and Readonly Fields) 深入理解OOP(六):枚举(实用方法)

关于C++中公有继承、私有继承、保护继承的讨论

一.文章来由 简单明了的理由,老生常谈但是没真正解决的问题,想搞清楚这个问题. 二.冗长的定义 我们先来看看这些冗长的定义: 公有继承: 当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问.也就是说基类的公有成员和保护成员被继承到派生类中访问属性不变,仍作为派生类的公有成员和保护成员,派生类的其他成员可以直接访问它们.在类族之外只能通过派生类的对象访问从基类继承的公有成员. 私有继承: 当类的继承方式为私有继承时,基类中的公有成员和保护成员

C++中公有继承、保护继承、私有继承的区别

公有继承时基类中各成员属性保持不变,基类中private成员被隐藏.派生类的成员只能访问基类中的public/protected成员,而不能访问private成员:派生类的对象只能访问基类中的public成员. 私有继承时基类中各成员属性均变为private,并且基类中private成员被隐藏.派生类的成员也只能访问基类中的public/protected成员,而不能访问private成员:派生类的对象不能访问基类中的任何的成员. 保护继承时基类中各成员属性均变为protected,并且基类中p