C++:面向对象程序设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37413035/article/details/80171173

面向对象程序设计(OOP)基于三个基本概念:数据抽象、继承和动态绑定(即封装、继承、多态)。
通过使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。

动态绑定

动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法(在C++语言中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定)。

Note: 基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此!
在派生类对象中含有与其基类对应的组成部分,这一事实是继承的关键所在。派生类必须使用基类的构造函数来初始化他的基类部分。每个类控制它自己的成员初始化过程。首先初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员。

关键概念:遵循基类的接口

必须明确一点:每个类负责定义各自的接口。要想与类的对象交互必须使用该类的接口,即使这个对象是派生类的基类部分也是如此。因此,派生类对象不能直接初始化基类成员。尽管从语法上说我们可以在派生类构造函数体内给它公有或受保护的基类成员赋值,但是最好不要这么做。和使用基类的其他场合一样,派生类应该遵循基类的接口,并且通过调用基类的构造函数来初始化那些从基类中继承而来的成员。

Note:理解基类和派生类之间的类型转换是理解C++语言面向对象编程的关键所在。和内置指针一样,智能指针也支持派生类向基类的类型转换,这意味着我们可以将一个派生类对象的指针存储在一个基类的智能指针内。派生类向基类的自动类型转换只对指针或引用类型有用,在派生类类型和基类类型之间不存在这样的转换(在对象之间不存在类型转换,有时派生对象看似能够转换为它的基类的原因是:拷贝构造函数是使用引用的)。当我们用一个派生类对象为一个基类对象初始化或赋值时, 只有该派生类对象中的基类部分会被拷贝,移动或赋值,它的派生类部分将被忽略掉。

关键概念:存在继承关系的类型之间的转换规则

(1)从派生类向基类的类型转换只对指针或引用类型有效。
(2)基类向派生类不存在隐式类型转换。
(3)和任何其他类型一样,派生类向基类类型的转换也可能会由于访问受限而变得不可行(例如,只有当D公有继承B时,用户代码才能使用派生类向基类的转换;如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换)。

关键概念:C++的多态性

OOP的核心思想是多态性(polymorphism)。 我们把具有继承关系的多个类型称为多态类型,引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。

Note: 当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。基类中的虚函数在派生类中隐含地也是一个虚函数。当派生类覆盖了某个虚函数时,该函数在基类中的形参必须与派生类中的形参严格匹配。虚函数也可以拥有默认实参,如果某次函数调用使用了默认实参,则该实参值由本次调用的静态类型决定,换句话说,如果我们通过基类的引用或指针调用函数,则使用基类定义的默认实参,即使实际运行的是派生类中的函数版本也是如此。
Best Practices: 如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。

关键概念:重构

重构负责重新设计类的体系以便将操作和/或数据从一个类移动到另一个类中。 对于面向对象的应用程序来说,重构是一种很普遍的现象。

猜你喜欢

转载自blog.csdn.net/weixin_37413035/article/details/80171173