从新捡起c++,封装继承多态

封装:

封装从通俗意义上理解,可以理解为,把一些数据包装为函数,通过函数去访问这些数据。

封装的意义:在于保护或者防止数据被破坏,所以提供一个公共的函数,给别人去访问,可以很好的保存我们的数据。

经典的封装:面向对象中,get和set函数,get获取对象数据,set设置对象数据。假如对象有3个私有数据,但只对外提供一个访问,那么使用封装很安全的保护了另外两个。举例:学车只需要知道踩油门,刹车,转方向等这些操作,类似于发动机的制造就没有必要了解。在这个例子中,汽车就是封装的对象,踩油门,和刹车,转方向是汽车提供的一个接口函数,只需要去操作,不关系通过踩油门传动进去内在的实现。发动机等制造就是属于私有的不对外的数据,你知道有,但不让你处理,也不给你操作权限。

一般数据放在private中,protected可以被类本身,和派生类访问。public公共存取,访问。

继承:

c++中有三种属性,公共(public)、受保护(protected)、私有的(private)

在这里用张图说明下继承,权限的问题。

解释:公有继承,父类的公共部分,在子类仍然是共有存在。父类受保护的部分,子类也是受保护的部分,私有部分(这个有人说继承了,但是不可以访问,也有人说没有继承,也不可以访问)。(很早之前做过一个测试,是继承了,但是不能访问,很模糊了。后续再测试下)。

受保护继承:父类的公有和受保护部分,在受保护继承之后,都是子类的受保护部分,私有部分不可以访问。

私有继承:父类的所有部分,在子类中以私有存在,父类的私有不可以访问。

综合可以归类如下:

1、子类拥有父类非private的属性和方法。

2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

3、子类可以用自己的方式实现父类的方法。(以后介绍)。

4、友缘函数可以访问基类的私有属性。

多态:

基本用法是:使用基类指针调用子类重写的方法。

同一操作作用不同的对象,可以有不同的解释,产生不同的执行结果。

允许将子类类型的指针赋值给父类类型的指针,多态性在C++中是通过虚函数实现的。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”,或者称为“重写”。子类重写父类中虚函数时,即使不用virtual声明,该重载函数也是虚函数。

构造函数和析构函数:

构造函数的特点:

1.构造函数与类同名,没有返回值。

2.构造函数和其它成员函数一样,都能被重载。

3.构造函数不能被声明为const。

4.当没有声明构造函数的时候,编译器会隐式生成一个默认构造函数,这个构造函数什么都不做。

析构函数是一类特殊的成员函数,它会在每次删除所建行对象执行。

析构函数的特点:

1. 析构函数也和类名相同,不过需要在前面加上~便于与构造函数区分。
2. 析构函数没有返回值,不能够被重载,和构造函数不同
3. 当对象被撤销时析构函数自动调用,与构造函数不同的是,析构函数可以被显示调用,已释放对象中动态申请的内存。
无法声明为 const、volatile 或 static。 但是,可以为声明为 const、volatile 或 static 的对象的析构调用它们。
4. 一般情况下析构函数声明为volatile虚函数。

构造函数和虚构函数,顺序相反。

虚函数注意事项:(引用此文章:https://www.cnblogs.com/dormant/p/5223215.html

1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的。 

2.只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。 

3.静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。 

4.内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义定义,但是在编译的时候系统仍然将它看做是非内联的。 

5.构造函数不能是虚函数,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。 

6.析构函数可以是虚函数,而且通常声名为虚函数。析构函数声明成虚函数的时候,会有效的避免内存泄漏

猜你喜欢

转载自blog.csdn.net/qq_37347705/article/details/84029517