【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";

访问权限

基类成员的访问权限可设置为publicprotectedprivate。子类可根据需要访问基类成员。

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

类的定义

  • 确定共性:将共有属性和行为定义为基类。
  • 定义特性:通过虚函数实现动态行为特化。
  • 设定访问级别:合理分配publicprotectedprivate
  • 虚函数静态调用

    虚函数可通过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

    多态类鉴定

    使用typeidtypeinfo头文件,检查多态类绑定情况。

    #include 
    using 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++中继承和多态的核心概念及应用,帮助开发者更好地理解和使用高级类管理技术。

    上一篇:【C++】Essential c++第六章学习笔记
    下一篇:【C++】Essential c++ 第四章学习笔记

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年03月28日 00时52分30秒