C++ – 面向对象编程方法

“以对象为基础(object-based)”的类机制无法针对如”are-a-kind-of(隶属同类)”的Book类的共通性质进行系统化的划分(如:RentalBook、AudioBook、InterativeBook)。因此,类间的关系有赖于”面向对象编程模型(object-oriented programming model)”加以设定。

面向对象编程概念的两项最主要特质是:继承(inheritance)和多态(polymorphism)。前者使我们得以将一群相关的类组织起来,并让我们得以分享其间的共通数据和操作行为;后者让我们在这些类之上进行编程时,可以如同操控单一个体,而非相互独立的类,并赋予我们更多弹性来加入或移除任何特定类。

1)继承(inheritance)

继承机制定义了父子(parent/child)关系。父类(parent)定义了所有子类(children)共通的公有接口(public interface)和私有实现(private implementation)。每个子类都可以增加或覆盖(override)继承而来的东西,以实现其自身独特的行为。
在C++中,父类被称为基类(base class),子类被称为派生类(derived class)。父类和子类之间的关系则称为继承体系(inheritance hierarchy)。

2)多态(polymorphism)

让基类的pointer或reference得以十分透明的(transparently)指向其任何一个派生类的对象。

void function(LibMat &mat) {

    mat.check_in();

}

静态绑定(static binding):
程序执行之前就已经解析出应该调用哪一个函数。即编译器在编译时就依据mat所属的类决定应执行哪一个check_in()函数。
动态绑定(dynamic binding):
在面向对象编程方法中,编译器无法得知哪一份check_in()函数会被调用。每次function执行时,仅能在执行过程中依据mat所指的实际对象来决定调用哪一个check_in()。”找出实际被调用的究竟是哪一个派生类的check_in()函数”这一解析操作会延迟至运行时(run-time)才进行。

多态和动态绑定的特性只有在使用pointer或reference时才能发挥。

#include

class LibMat
{
public:

    LibMat() { std::cout << "LibMat::LibMat() default constructor!\n"; }

    virtual ~LibMat() { std::cout << "LibMat::~LibMat() destructor!\n"; }
    virtual void print() const { std::cout << "LibMat::print() -- I am a LibMat object!\n"; }
};

class Book : public LibMat
{
public:
    Book(const std::string &title, const std::string &author)
        : _title(title), _author(author)
    {
        std::cout << "Book::Book( " << _title
                  << ", " << _author << " ) constructor!\n";
    }

    virtual ~Book()
    {
        std::cout << "Book::~Book() destructor!\n";
    }

    virtual void print() const
    {
        std::cout << "Book::print() -- I am a Book object!\n"
                  << "My title is: " << _title << '\n'
                  << "My author is: " << _author << std::endl;
    }

    const std::string &title() const { return _title; }
    const std::string &author() const { return _author; }

protected:
    std::string _title;
    std::string _author;
};

class AudioBook : public Book
{
public:
    AudioBook(const std::string &title,
              const std::string &author, const std::string &narrator)
        : Book(title, author), _narrator(narrator)
    {
        std::cout << "AudioBook::AudioBook( " << _title
                  << ", " << _author
                  << ", " << _narrator
                  << " ) constructor!\n";
    }

    ~AudioBook()
    {
        std::cout << "AudioBook::~AudioBook() destructor!\n";
    }

    virtual void print() const
    {
        std::cout << "AudioBook::print() -- I am an AudioBook object!\n"
                  << "My title is: " << _title << '\n'
                  << "My author is: " << _author << '\n'
                  << "My narrator is: " << _narrator << std::endl;
    }
    const std::string &narrator() const { return _narrator; }

protected:
    std::string _narrator;
};

void print(const LibMat &mat)
{
    std::cout << "in global print(): about to print mat.print()\n";

    mat.print();
}

int main()
{
    AudioBook ab("Mason and Dixon", "Thomas Pynchon", "Edwin Leonard");
    std::cout << "The title is " << ab.title() << '\n'
              << "The author is " << ab.author() << '\n'
              << "The narrator is " << ab.narrator() << std::endl;
}

输出结果:

LibMat::LibMat() default constructor!

Book::Book( Mason and Dixon, Thomas Pynchon ) constructor!

AudioBook::AudioBook( Mason and Dixon, Thomas Pynchon, Edwin Leonard ) constructor!The title is Mason and Dixon
The author is Thomas Pynchon
The narrator is Edwin Leonard
AudioBook::~AudioBook() destructor!

Book::~Book() destructor!

LibMat::~LibMat() destructor!

在上述示例的基础上我们运行如下程序:

void print(LibMat object, const LibMat *pointer, const LibMat &reference)
{
    std::cout << "object.print();" << std::endl;
    object.print();
    std::cout << "pointer->print();" << std::endl;
    pointer->print();
    std::cout << "reference.print();" << std::endl;
    reference.print();
}
int main()
{
    AudioBook ab("Mason and Dixon", "Thomas Pynchon", "Edwin Leonard");
    print(ab, &ab, ab);
}

我们会得到如下输出:

object.print();
LibMat::print() -- I am a LibMat object!

pointer->print();
AudioBook::print() -- I am an AudioBook object!

My title is: Mason and Dixon
My author is: Thomas Pynchon
My narrator is: Edwin Leonard
reference.print();
AudioBook::print() -- I am an AudioBook object!

My title is: Mason and Dixon
My author is: Thomas Pynchon
My narrator is: Edwin Leonard

我们可以看到在LibMat object中虽然传入的对象时AudioBook但是调用的print()却是基类LibMat的print()函数。这是因为当我们声明一个基类的实例对象时,分配的内存空间不足以容纳我们传入的派生类对象,其子对象部分便被裁切(sliced off)了,只复制了基类的data member部分。因此多态(polymorphism)需要一层间接性。

#include
int main()
{
    Book book("Mason and Dixon", "Thomas Pynchon");
    LibMat *lm = &book;
    std::cout << typeid(*lm).name() << std::endl;

    if(typeid(*lm) == typeid(Book)) {
        Book *b = static_cast<Book*>(lm);
        b->print();
    }

    if(Book *b = dynamic_cast<Book*>(lm)) {
        b->print();
    }
}

Original: https://blog.csdn.net/weixin_45919985/article/details/128326757
Author: Spikeeee-
Title: C++ – 面向对象编程方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/777642/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • [C++] 习题 2.18 倒序查找字串

    前置技能 字符串 KMP 算法 需求描述 概要设计 具体实现 string.cpp strmatching.cpp main.cpp 倒序查找字串: 设计一个算法,在串 str 中…

    Python 2023年6月6日
    0122
  • mac python3.8怎样安装scrapy_mac下安装scrapy的各种艰辛

    安装pip:sudo python get-pip.py 2.修改pip源码地址(国外地址太慢) Mac配置 .pip/pip.conf mkdir .pip touch pip….

    Python 2023年10月6日
    022
  • DATA-OBJECT-PROP (DOP)

    dop参考:https://zhuanlan.zhihu.com/p/61579911 Original: https://www.cnblogs.com/Flashcc/p/16…

    Python 2023年6月12日
    069
  • 用Scrapy爬取王者皮肤海报~

    文章目录 咳咳,这里可以直接下载皮肤 这篇博客的由来 先看一下成品。 一、口水话说说,ImagePipeline * 0、一般来说,简单使用ImagesPipeline。 1.Im…

    Python 2023年10月2日
    061
  • 数据分析工具Pandas基础–运算与对齐

    知识要点 Series 的运算: 对齐操作发生在索引上 DataFrame 的运算: 对齐操作会同时发生在行和列上,注意:Series和DataFrame操作时,Series被看作…

    Python 2023年8月9日
    076
  • numpy中有哪些简单且实用的操作

    图解形式入门numpy 看到 NumPy 是如何理解这个运算的了吗?这个概念叫做广播机制(broadcasting),它非常有用。上图为索引示例上面是聚合函数,聚合功能的使用。 我…

    Python 2023年8月28日
    055
  • Unity游戏开发:对话系统的实现

    在解谜类游戏中,与npc的对话是一个基础且常用的功能。通常来说,在与npc的对话中玩家可以获取一些有价值的信息并对之后的游戏有一定的导向作用。此外,在玩家获取对应物品前后,与npc…

    Python 2023年10月8日
    055
  • Python 自动清理电脑垃圾文件,一键启动即可

    经常存在在我们的电脑中的垃圾文件主要是指系统在运行过程中产生的tmp临时文件、日志文件、临时备份文件等。垃圾清理器的作用其实也是对这些文件进行清理,不会影响到我们使用产生的数据文件…

    Python 2023年5月24日
    0103
  • scrapy 爬虫的基础配置与使用

    文章目录 * – 安装Python环境 – 安装Scrapy环境 – 安装Twisted – pip的安装 – scra…

    Python 2023年10月3日
    053
  • python——numpy库

    目录 1.通过导入numpy库来创建N维数组对象(ndarray) 2.创建其它数组 3.ndarray的索引和切片 4.numpy通用函数 5.利用numpy数组进行数据处理 6…

    Python 2023年8月25日
    059
  • 【敏捷转型,效能提升】万字长文敏捷转型实践系列分享

    作者:王先科、田野、王锁、刘双、马越、刘思琪 摘要:本文总结了近4年以来部门实施敏捷转型的实践及经验教训,从5个方面进行了阐述: 文化建设下好先手棋 持续敏捷实践祭出连环招 沉淀实…

    Python 2023年10月12日
    050
  • The Zen of Python

    简述 Python 中有一个彩蛋 – ​​The Zen of Python​​,被称作: Python 之禅、Python 之道、Python 箴言 … …

    Python 2023年5月24日
    092
  • 咖啡厅适合什么样的H5互动小游戏?H5小游戏制作平台

    随着H5互动小游戏应用的越来越普遍,采用游戏营销的商家越来越多,TOM游戏小编就发现其实有很多线下咖啡店非常适合做h5游戏营销,下面就帮助大家分析下为什么说H5游戏适合咖啡厅?咖啡…

    Python 2023年9月24日
    041
  • 多目标跟踪(MOT)数据集资源整理分享

    我们已经生活在一个被摄像头和视频包围的世界里,从手机、汽车、无人机到各类监控设备,随处可见摄像头的”身影”。据前瞻产业研究院2020年的报告分析,预计到20…

    Python 2023年9月30日
    077
  • pandas数据变形之关联

    1.数据关联的几种方式-inner_join内连接、outer_join外连接、left_join左连接、righr_join右连接。 import pandas as pd df…

    Python 2023年8月9日
    046
  • 跟我学Python图像处理丨图像分类原理与案例

    摘要:本篇文章将分享图像分类原理,并介绍基于KNN、朴素贝叶斯算法的图像分类案例。 本文分享自华为云社区《[Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法…

    Python 2023年9月15日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球