目录
C语言是面向过程的语言,C++面向对象,和所有面向对象的语言一样(JAVA、Python等)有着封装、继承、多态的性质。
封装
封装字如其名,就是把所有的数据和处理过程封装在一起,用类(class)来定义,之后只能通过接口来访问,使类成为一个能隐藏自身细节,功能独立的模块,降低各个模块之间的耦合性。
意义:保护类中成员,防止代码或数据在无意识中被破坏,不允许类外成员直接访问或修改类中成员,只能通过提供的公共结构去访问,提高了类中成员的数据安全性。
继承
子类继承父类的特征和行为,复用基类所有的成员变量和成员函数,具有从基类复制而来的所有成员变量和成员函数(基类私有成员可被继承,但不可被访问)。其中构造函数、析构函数、友元函数、静态成员变量、静态成员函数(构造函数和析构函数属于类初始化和清理的函数,派生类有属于自己的构造函数和析构函数,无法继承,但每次需要先调用基类的构造函数初始化对象中基类的部分再调用派生类的构造函数初始化派生类的部分,析构函数相反;友元函数属于类授予特定函数和类的特权使其可以访问其私有属性和方法,如果继承则会打破封装原则,每个类应该显性控制友元的授权,不可继承;静态成员变量和静态成员函数都属于类级别,和对象无关,所有实例共享。通过类名作用域使用,继承会破环这种明确性;注意不能被继承不等同于不能使用和访问,基类的构造函数和析构函数派生类都可以使用,友元函数、静态成员都只能用父类作用域去访问。)都不能被继承。基类中的访问权限只能决定派生类能否访问他们,增强了代码耦合性,当父类中的虚函数或者类本身被final字段修饰时,不可被继承或者重写。意义:基类的代码可以被派生类复用,提高了软件复用的效率,大大缩短了软件开发的周期。
多态
不同派生类的对象对同一消息做出不同响应,基类的指针可以绑定到不同的派生类对象上,这使得基类的指针可以呈现不同的表现形式。意义:对已存在的代码具有可替代性,对代码具有可扩充性,新增子类不会影响已存在类的各种性质,在程序中体现了灵活多变的操作,提高了使用效率,简化了对应用代码的编写和修改过程。
访问权限
语法和定义
在类中共有三种访问权限:
- public:公共权限,类内类外皆可访问。
- protected:保护权限,类内可以访问,类外不可以访问,子类可以访问。
- private:私有权限,只有类内可以访问。
具体使用方法在类内使用访问权限修饰符加":",可修饰之后的成员变量和成员函数,直至遇到下一个访问权限修饰符或类结束为止。如下:
class Person
{
public:
int geta()
{
return a;
}
void seta(int x)
{
this->a=x;
}
private:
int a;
};
继承时的访问权限
继承语法如下:class 派生类:继承方式 基类
这里的继承方式是指访问权限修饰符,关于继承方式有以下规则:
- 继承方式为public,则基类中修饰符为public和protected的成员变量和函数在派生类中维持不变。
- 继承方式为protected,则基类中修饰符为public和protected的成员变量和函数在派生类中都转变为protected。
- 继承方式为private,则基类中修饰符为public和protected的成员变量和函数在派生类中都转变为private。
基类中private修饰的成员变量和成员函数,无论哪种继承方式派生类都无法访问。
可以发现继承方式实质上决定的是基类的成员变量和成员函数在派生类中的访问权限问题,给了派生类修改基类的成员变量和成员函数访问权限的机会。
继承时的访问权限可以当作派生类给继承过来的数据和方法一个权限上限,具体权限要和基类的权限和继承方式取min。
默认访问权限
C++中定义类和对象有class和struct两种类型,两者的区别在于默认访问权限不同。
class默认访问权限为private,默认继承方式也是private,同时可以用作模板参数定义,是纯C++特性,常用于封装复杂逻辑,面向对象编程。
struct默认访问权限为public,默认继承方式也是public,不可用于模板参数定义,由于历史问题(C++是由C扩展而来),主要目的是完全兼容C语言的struct,常用于简单的数据聚合。
构造函数和析构函数继承时的默认调用和调用顺序
先形成一个正确的理解,就是派生类对象在内存中包含基类的子对象,并非复制基类的成员到派生类中。基类成员在基类对象中,派生类成员在派生类对象中,整个对象时一个连续的内存块,包含基类对象和派生类对象,访问权限(基类中的访问权限和继承方式共同决定)是控制派生类能否访问基类对象中的基类成员。所以可以大致理解为派生类中的基类子对象都需要回到基类中去初始化和销毁(这个时候不需要关注是否能访问到)。
C++封装、继承、多态知识详解

最低0.47元/天 解锁文章
1677

被折叠的 条评论
为什么被折叠?



