C++primer面向OOP程序设计(3)

1.继承:

在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。对于

某此函数,基类希望它的派生类个自定义适合自身的版本,此时基类就将这此函数声明成

虚函数(virtual function ) 因此,我们可以将Quote类编写to

class Quote{

public:

std::string isbn()

v工rtual double net

};

const;

price(std::size_t n)  const;

派生类必须通过使用类派生列表(class derivation list )确指处它是那个类继承而来的。类派尘列表的形式是:首先是一个’冒号,后而紧跟以逗号分隔的基类列表,

其中每个基类前面可以有访问说说明符:

class Bulk_ quote:public Quote{

public:

double net_price(std::size t) const override ;//Bulk_quote继承了Quote

};

• C++的虚函数主要是为了实现多态。基类定义的虚函数,派生类重新定义该函数,这样基类对象指针调用哪一个函数是判断该基类指针的对象的类型。

• 虚函数用virtual关键字修饰,同时开启动态联编技术,动态联编只有程序运行时才能确定调用的函数,在编译阶段是不知道要调用哪一个函数。

函数的运行版本由实参决定,即在运行时选择函数的版本,所以动态绑定有时候又被称为运行时绑定(run-time binding )

在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定!

2.基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如

如此。

3成员函数与继承:

在C.++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进

行覆盖的函数:另种是基类直接继承而不要改变的函数。对上前者,基类通常将其定义为虚函数VIRTUAL。我们使用指针或引用调用啦函数时,该调用将被动态绑定。根据引川或指针所绑定的对象类型不同,该调用可能执行基础类的版本,也可能执行某个派生类的版本。

任何构造函数之外的非静态函数都可以是虚函数,关键字virtual  只能出现在类内部的声明语句之前而不能定义在类外部的函数定义。如果基类被定义为虚函数那么!他的派生类也隐示为虚函数!

4.在派生类对象中含有与其基类对应的组成部分,这一事实是继承的关键所在。

5.每个类控制它自己的成员初始化过程。

6.继承与静态成员:

如果基类定义了一个静态成员则在整个继承体系,只存在该成员的唯一定义。不沦从基类,派生出来多少个派生类,对于每个静态成员来说都只存在准一的‘实例。

Class  Base{

Public:

static  void statmem();

};

Class  Der:public  Base{

void  f(const Der);

}

静态成员遵循通用的访问于控制规则,如果基类中的成员是private的.则派生类无权访问

问它。假设某静态成员是可访问的,则我们既能通过堪类使用他也能通过派生类使用它:

7.和内置指针一样,智能指针类也支持派生类向基类的类型转换,这意味着我们可以将一个派生类对象的指针存储在一个基类的智能指针内。

8.存在继承关系的类型之间的转换规则:

要想理解在具有继承关系的类之间发生的类型转换,有三点非常重要:

•    从派生类向基类的类型转换只对指针或引用类型有效

•    墓类向派生类不存在隐式类型转换。

•    和任何其他成员一样,派生类向基类的类型转换也可能会由于访问受限而变得不 可行。

尽管自动类型转换只对指针或引用类型有效,但是继承体系中的大多数类仍然(显式或

隐式地)定义了拷贝控制成员因此,我们通常能够将一个派生类对象拷贝、移动或赋值给一个基类对象不过需要注意的是,这种操作只处理派生类对象的

基类部分。

9.C++多态性

OOP的核心思想是多态性(polymorphism)多态性这个词源自希腊语,其含义是

“多种形式”我们把具有继承关系的多个类型称为多态类型,因为我们能使用这些类型

的“多种形式”而无须在意它们的差异。引用或指针的静态类型与动态类型不同这一事

实正是C++语言支持多态性的根本所在。

当我们使用基类的引用或指针调基类中定义的一个函数时,我们并不知道该函数

真正作用的对象是什么类型,因为它可能是一个基类的对象也可能是一个派生类的对

象。如果该函数是虚函数,则直到运行时才会决定到底执行哪个版本,判断的依据是引

用或指针所绑定的对象的真实类型。

另一方面,对非虚函数的调用在编译时进行绑定。类似的,通过对象进行的函数(虚

函数或非虚函数)调用也在编译时绑定对象的类型是确定不变的,我们无论如何都不

可能令对象的动态类型与静态类型不一致。因此,通过对象进行的函数调用将在编译时

绑定到该对象所属类中的函数版本上。

当且仅当对通过指针或引用调用虚函数时,才会在运行时解析该调用,也只有

在这种情况下时象的动态类型才有可能与静态类型不同

10.名字查找与继承

理解函数调用的解析过程刘一于理解C++-的继承至关重要,假定我们调用p一>mem ( )

(或者obj . mem ( )),则依次执行以下4个步骤:

•    首先确定p(或obj)的静态类型因为我们调用的是一个成员,所以该类型必

然是类类型。

•    在p(或。bj)的静态类型对应的类中查找mem如果找不到,则依次在直接基

类中不断查找直至到达继承链的顶端如果找遍了该类及其基类仍然找不到,则编译器

将报错。

•    一旦找到了mem,就进行常规的类型检查(参见6.1节,第183页)以确认对于

当前找到的mem,本次调用是否合法。

•    假设调用合法,则编译器将根据调用的是否是虚函数而产生不同的代码:

一如果mem是虚函数且我们是通过引用或指针进行的调用,则编译器产生的代

码将在运行时确定到底运行该虚函数的哪个版本,依据是对象的动态类型。

一反之,如果mem不是虚函数或者我们是通过对象(而非引用或指针)进行的

调用,则编译器将产生一个常规函数调用。


404-CSDN提示页面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,484评论 1 51
  • 一、程序设计概念等 结构化程序设计特点: 程序设计=数据结构+算法程序内容=过程+过程调用 面向对象的程序设计方法...
    C2U阅读 675评论 0 1
  • 听完音乐会,大家情绪高涨各自感怀,罗詠说《卿云歌》三人合奏气势更恢宏更有王者之风。我说这次听《渔樵问答》长耳力了,...
    青蘭阅读 796评论 2 3
  • 夜里偶然和朋友聊起城市的话题,我便问他,“你有没有特别向往的城市,百看不厌的那种”,朋友答到,青岛,那里有他太多故...
    不思量znw阅读 578评论 8 9