
【C++】Essential c++第五章学习笔记
确定共性:将共有属性和行为定义为基类。 定义特性:通过虚函数实现动态行为特化。 设定访问级别:合理分配
发布日期:2021-05-08 14:57:18
浏览次数:20
分类:精选文章
本文共 3251 字,大约阅读时间需要 10 分钟。
#Essential C++ 第五章:高级类管理
概述
第四章主要介绍了类的基本结构与成员管理,第五章则深入探讨如何高效管理多个相关类。面向对象编程的核心在于继承和多态。继承通过抽象共性,实现类间的层次化管理;多态则通过动态绑定,实现函数的特化调用。
继承
基类与派生类
基类(Base Class)承载所有共性,派生类(Derived Class)则保留个性。通过:
符号定义继承关系,派生类继承基类成员,并可定义自身属性和方法。
class Book {public: string author; string name;};class Audiobook : public Book {public: string narrator;};Audiobook abk;abk.author = "me";abk.name = "mybook";abk.narrator = "he";
访问权限
基类成员的访问权限可设置为public
、protected
或private
。子类可根据需要访问基类成员。
class Book {public: string author; string name;protected: string id;private: int age;};class Audiobook : public Book {public: string narrator;};Audiobook abk;abk.author = "me"; // 可访问abk.id = "123"; // 可访问// 不能访问 age
构造与析构
基类构造函数会被子类调用。若子类不定义析构函数,会使用基类的析构函数。
class Book {public: Book(string author, string name) : author(author), name(name) {}};class Audiobook : public Book {public: Audiobook(string author, string name, string narrator) : Book(author, name), narrator(narrator) {}};Audiobook abk("me", "mybook", "he");
同名函数
若基类和派生类有同名函数,子类函数会掩盖基类函数。
class Book {public: void f(int a) { cout << "Book" << endl; }};class Audiobook : public Book {public: void f() { cout << "Audiobook" << endl; }};Audiobook abk;abk.f(); // 调用 Audiobook::fabk.f(1); // 无法调用
多态
造型
造型分为向上造型和向下造型。向上造型(Upcasting)安全,向下造型(Downcasting)需谨慎。
class Book {public: virtual void f() { cout << "Book" << endl; }};class Audiobook : public Book {public: void f() { cout << "Audiobook" << endl; }};Book* bk = new Audiobook;bk->f(); // 调用 Book::f
静态绑定
静态绑定确保函数调用时使用基类版本。
class Book {public: virtual void f() { cout << "Book" << endl; }};class Audiobook : public Book {public: virtual void f() { cout << "Audiobook" << endl; }};Book* bk = new Audiobook;bk->f(); // 调用 Book::f
虚函数
虚函数通过virtual
关键字定义,实现动态绑定。
class Book {public: virtual ~Book() {} virtual void f() { cout << "Book" << endl; }};class Audiobook : public Book {public: virtual ~Audiobook() {} virtual void f() { cout << "Audiobook" << endl; }};Book* bk = new Audiobook;bk->f(); // 调用 Audiobook::f
类的定义
public
、protected
、private
。虚函数静态调用
虚函数可通过class scope
强制静态调用。
class Book {public: class BookScope { void f() { cout << "BookScope" << endl; } }; virtual void f() { cout << "Book" << endl; }};class Audiobook : public Book {public: class AudiobookScope { void f() { cout << "AudiobookScope" << endl; } }; virtual void f() { cout << "Audiobook" << endl; }};Book bk;bk.BookScope::f(); // static callbk.f(); // dynamic call
多态类鉴定
使用typeid
和typeinfo
头文件,检查多态类绑定情况。
#includeusing namespace std;class Book {public: virtual void print() { cout << "Book" << endl; }};class Audiobook : public Book {public: virtual void print() { cout << "Audiobook" << endl; }};Book bk;Audiobook abk;cout << typeid(bk).name() << endl;if (typeid(bk) == typeid(Book)) { Book* b = static_cast (bk); cout << b->Book::author() << endl;}
类型转换
静态转换需确保类型匹配,动态转换无需检查。
Book* lb = new Audiobook;if (typeof(*lb) == typeid(Book)) { Book* b = static_cast(lb); cout << b->author() << endl;}Book* b1 = dynamic_cast (lb);if (b1) { cout << b1->author() << endl;}
本文详细阐述了C++中继承和多态的核心概念及应用,帮助开发者更好地理解和使用高级类管理技术。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月28日 00时52分30秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Hibernate入门(四)---------一级缓存
2019-03-06
MySQL事务(学习笔记)
2019-03-06
一个web前端开发者的日常唠叨
2019-03-06
内存分配-slab分配器
2019-03-06
技术写作技巧分享:我是如何从写作小白成长为多平台优秀作者的?
2019-03-06
Jupyter Notebook 暗色自定义主题
2019-03-06
[Python学习笔记]组织文件
2019-03-06
基于Redo Log和Undo Log的MySQL崩溃恢复流程
2019-03-06
从RocketMQ的Broker源码层面验证一下这两个点
2019-03-06
如何正确的在项目中接入微信JS-SDK
2019-03-06
纵览全局的框框——智慧搜索
2019-03-06
快服务流量之争:如何在快服务中占领一席之地
2019-03-06
【活动】直播揭秘<如何从0开发HarmonyOS硬件>
2019-03-06
Unity平台 | 快速集成华为性能管理服务
2019-03-06
对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
2019-03-06
使用Power BI构建数据仓库与BI方案
2019-03-06
Django认证系统并不鸡肋反而很重要
2019-03-06
快用Django REST framework写写API吧
2019-03-06
tep用户手册帮你从unittest过渡到pytest
2019-03-06
12张图打开JMeter体系结构全局视角
2019-03-06