`

【C++ Primer】第十三章 类继承

 
阅读更多

一,类继承

定义:从已有的类派生出新的类,而派生类继承了原有类的特征,包括方法。

目标:提供可重用的代码

二,一个简单的基类

输出:

【简介】1)继承类 继承了基类的私有成员,但是不能通过继承类的对象直接访问私有成员

2)派生类不能直接访问基类私有成员,派生类构造函数必须使用基类构造函数

3)派生类构造函数特点:基类对象首先被创建 创建graduate gd(); student 对象先被创建

创建派生类对象时,先调用基类构造函数,再调用派生类构造函数

派生类对象过期时,先析构派生类,再析构基类

4)不能讲基类对象和地址赋给派生类

student st;

graduate &gd=st; // Not Allow

graduate *gd=st; // Not Allow

如果允许的话,则基类可以访问派生类成员,但访问基类没有的成员,对于基类对象来说是没有意义的

st.setThesis(int i) //因为基类没有该方法

三,继承----- is-a 关系

继承方式:共有继承、私有继承、保护继承

共有继承建立一种is-a关系:派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行

例如:Fruit 是水果类,有重量和热量。Banana是派生类,包含重量和热量外,还添加专门香蕉成员,这些成员通常不用于Fruit.

四,多态共有继承

两种实现机制:1>在派生类中重新定义基类方法。2>使用虚方法

不存在虚拟构造函数,但基类的虚拟析构函数是必要的。请看下例:输出:Do something in class ClxDerived!
Output from the destructor of class ClxDerived!
这个很简单,非常好理解。
但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
Do something in class ClxDerived!
也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

五,静态联编和动态联编

函数名联编:将源代码中函数调用解释为执行特定的函数代码块

但是在C++中由于函数重载,编译器必须查看函数参数以及函数名才能确定使用哪个函数

静态联编:在编译过程中进行联编

但是虚函数使这项工作变得更困难,使用哪一个函数不能在编译时确定

动态联编:程序运行时选择正确虚方法的代码

1)为什么有两种类型联编,为什么 静态联编为默认

动态联编让您能够重新定义类方法,而静态联编则很差,但静态联编效率高。

如果派生类不重新定义基类任何方法,则不需要动态联编。仅仅将那些派生类需要重新定义的函数定义为虚拟的

2)虚函数工作原理

编译器给每个对象添加一个隐藏成员,其中保存一个该函数地址的指针,这种数组成为虚函数表。

调用虚函数时,查看存储在对象中虚拟函数表地址,然后转向相应函数地址表,如果使用类声明中定义的第一个虚函数,则程序将使用数组中的第一个函数地址,并执行具有该地址的函数。

3)注意事项

如果重新定义继承的方法,则应确保与原来的原型完全相同。

如果基类声明被重载了,则应在派生类中重新定义所有基类版本

六,抽象基类ABC(abstract base class)

说明:某几个子类的所公有的数据和方法抽象出来组成一个抽象基类,然后从抽象基类中派生出这几个子类,可以通过基类指针数组同时管理这几个子类。对于每个子类中的不同方法,可以将该方法在抽象基类中定义为纯虚函数的方式,同时在各子类中将该方法定义为虚函数。 };class Circle:public BaseEllipse //圆{private: double r;public: Circle(double t_x=0,double t_y=0,double t_r=0); //半径和中心坐标 Circle(const BaseEllipse & ba,double t_r=0); void Area()const;};class Ellipse:public BaseEllipse //椭圆{private: double a; double b;public: Ellipse(double t_x=0,double t_y=0,double t_a=0,double t_b=0); Ellipse(const BaseEllipse & p,double t_a=0,double t_b=0); void Area()const;};/*圆*/Circle::Circle(double t_x,double t_y,double t_r):BaseEllipse(t_x,t_y){ r=t_r;}Circle::Circle(const BaseEllipse & ba,double t_r):BaseEllipse(ba){ r=t_r;}void Circle::Area()const{ cout<<pi*r*r<<endl;}/*椭圆*/Ellipse::Ellipse(double t_x,double t_y,double t_a,double t_b):BaseEllipse(t_x,t_y){ a=t_a; b=t_b;}Ellipse::Ellipse(const BaseEllipse & ba,double t_a,double t_b):BaseEllipse(ba){ a=t_a; b=t_b;}void Ellipse::Area()const{ cout<<0.5*a*b<<endl;}int main(){ Circle c1(0,0,5); c1.Move(1,2); c1.Area(); Ellipse e1(0,0,7,8); e1.Move(3,4); e1.Area(); return 0;}


分享到:
评论

相关推荐

    c++primer第五版习题答案(第17章)

    《C++ Primer》第五版是C++领域一本非常权威的教材,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo编著。该书是按照C++11标准编写的,它涵盖了C++语言的核心特性,包括数据类型、运算符、控制结构、函数、类...

    c++primer plus第七章到第十三章习题源码

    从第七章到第十三章,这涵盖了类(classes)、对象(objects)、继承(inheritance)、多态(polymorphism)、模板(templates)以及异常处理(exception handling)等核心主题。以下是对这些章节习题源码中可能涉及...

    C++Primer 第四版课后习题解答(第1~18章完整答案)完整版

    第十三章“复制控制”讲解了构造函数、析构函数、拷贝构造函数和赋值运算符,以及深拷贝和浅拷贝的概念。习题解答会涵盖自定义拷贝控制以避免常见的资源管理问题。 这份完整的习题解答不仅有助于巩固C++的基础知识...

    C++ Primer第四版【中文高清扫描版】.pdf

    《C++ Primer 第四版》是著名的C++编程语言教程,由Stanley B. Lippman、Josée Lajoie和Barbara E. Moo三位作者共同撰写。该书自出版以来,已成为广大程序员学习C++的必备书籍。第四版对前三版的内容进行了彻底的...

    C++Primer(第4版)-课后习题答案.pdf

    13. 第十三章复制控制:探讨对象的创建、复制和销毁,包括拷贝构造函数、赋值运算符重载以及浅拷贝和深拷贝的问题。 14. 后续章节还会涉及模板、异常处理、命名空间、STL容器的高级用法、智能指针、多态、继承、虚...

    《C++ primer plus》第13章 类继承1

    《C++ Primer Plus》第13章主要讨论的是C++中的类继承,这是面向对象编程的一个核心概念。类继承允许我们基于已有的类创建新的类,新类(派生类)继承了旧类(基类)的特征,包括数据成员和成员函数。以下是关于这个...

    C++ Primer Plus 编程练习源码工程 第15章

    《C++ Primer Plus 编程练习源码工程 第15章》是针对C++初学者的一个宝贵资源,它包含了作者LeonardoLiuwenbo在学习《C++ Primer Plus》这本经典教材时所做的编程练习。这个章节聚焦于C++语言的深入特性,旨在通过...

    c++primer中文版勘误表

    类特化定义 删掉代码第三行中的return MRZROB 知识点:这里的修订是为了使类特化定义更加正确。在 C++ 中,类特化定义是用于定义类的特殊化的,而这里的修订是为了强调类特化定义的正确性。 26. 5322. 在模板定义...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     第13章 拷贝控制 439  13.1 拷贝、赋值与销毁 440  13.1.1 拷贝构造函数 440  13.1.2 拷贝赋值运算符 443  13.1.3 析构函数 444  13.1.4 三/五法则 447  13.1.5 使用=default 449  13.1.6 阻止拷贝 449  ...

    《C++ Primer中文版(第3版)》(Stanley B. Lippman[美]、Josee Lajoie[美] 著,潘爱民、张丽 译)

    C++ Primer结合了Stanley Lippman的实践经验和Josée Lajoie对于ANSI/...第十三章 类 第十四章 类的初始化、赋值和析构 …… 第五篇 面向对象的程序设计 第十七章 类继承和子类型 …… 英汉对照索引 ——《豆瓣读书》

    C++primer(第四版电子版非扫描)

    《C++ Primer》是C++编程领域的一本经典著作,由Lippman、Lajoie和 Moo三位专家共同编写,提供了全面且深入的C++学习指南。第四版针对C++11标准进行了全面更新,是现代C++编程的必备参考书籍。这个非扫描版意味着它...

    C++ primer 第四版 第十章 习题源码

    《C++ Primer 第四版》是C++编程领域的一本经典教材,它的第十章主要涵盖了类的高级特性,包括继承、多态、虚函数、模板等核心概念。这些习题源码是针对这一章节深入理解和实践的重要资源,适用于VC++6.0编译环境,...

    C++primer 第四版中文版 正书与习题解答 电子书 pdf

    C++ Primer第四版的重点知识点包括: 1. **基础语法**:涵盖变量声明、类型系统、运算符、流程控制语句(如if、switch、for、while)等。 2. **指针与引用**:理解指针作为内存地址的概念,以及引用作为安全的别名...

    C++Primer第五版 第7章 类(练习解答)

    C++Primer第五版是学习C++的权威指南,其中第七章详细讲解了类的相关概念和应用。这个压缩包包含了该章节的学习总结文档以及相关的源代码示例,有助于深入理解和实践类的使用。 一、类的定义与作用 类是C++中的一个...

    c++primerplus最全课后习题答案

    ### 第13章:模板 #### PE13-1至PE13-4 这部分习题讲解了模板的使用,这是C++中一种强大的泛型编程机制。读者可以学习到如何编写能够处理多种数据类型的通用函数和类。 ### 第14章:标准模板库 #### PE14-1至PE14...

    C++ primer 第四版 练习源码(第九章)

    《C++ Primer 第四版 练习源码(第九章)》是一份涵盖C++编程语言第九章核心概念和技巧的代码集合。这份资源对于学习C++,尤其是深入理解第九章内容的读者来说,是非常宝贵的实践资料。第九章通常会涉及类、对象和...

    C++ Primer 第五版习题答案(代码类习题答案源码)

    5. **STL(标准模板库)**:第十二章至第十三章介绍了C++的标准模板库,包括容器(如vector、list、set、map等)、迭代器、算法(如排序、查找)以及函数对象。源码会展示如何高效地利用STL进行数据处理。 6. **...

    C++ Primer 第四版课后习题答案

    第十三章 复制控制:讲解构造函数、析构函数、拷贝构造函数和赋值运算符,以及深拷贝和浅拷贝的概念。 这些章节的习题旨在帮助读者掌握每个主题的关键概念,通过实际操作加深理解和应用。解答习题是提升技能和解决...

    C++Primer中文版(第五版)习题答案

    "第十一章:异常处理"会讨论错误处理策略,使代码更加健壮。"第十二章:命名空间和链接"会涉及代码组织和库的使用。最后,"附录"通常会提供额外的参考资料,如ASCII码表、运算符优先级等。 总的来说,《C++ Primer...

    C++Primer习题答案

    第十三章 复制控制:讨论了拷贝构造函数、赋值运算符和移动语义,以及深拷贝和浅拷贝的区别,强调了正确实现复制控制以避免意外的副作用。 这些章节的内容构成了C++编程的基础,通过深入理解和实践,读者将能够掌握...

Global site tag (gtag.js) - Google Analytics