has - a, use - a , is - a (即继承);派生类的访问,多继承,虚继承 多态

xiaoxiao2021-02-28  2

面向对象 (封装、继承、多态)

封装的NB之处,将函数,变量结合在一起,可以作为函数参数传入,并使用里面定义的成员变量和方法。

继承的NB之处,继承可以复用以前人写的代码。以前别人写的类,你可以自己用。

多态的更NB之处,多态不光能继承前人写的代码,还能扩展后来的代码(即定义好框架以后,后来人自己通过基类派生出一个类,然后通过兼容性,可以传给框架里函数的形参,即实现了之前定义的框架,能够使用后代人定义的类)。

多态实现的三大条件:1 要有继承 2 要有虚函数重写 3 用父类指针(引用)指向子类对象。

C语言中,间接赋值 是指针存在的最大意义

                                             

类之间的关系:

has -a  ,包含关系, 一个类是另一个类的属性。

uses-a  , 类中有函数使用了另外一个类作为参数。

eg.  classA 

{

useB (B & obj ) ;

}

is - a  , 继承关系。

既具有传递性,都具有共同的特征,又具有不对称性。 

继承有三种继承, class Stu {  } ;

class    Stu1 : public Stu 

{  } ;

class    Stu2 : protected Stu 

{  } ;

class    Stu1 : private Stu 

{  } ;

派生类会继承父类的所有成员变量和成员函数,但是继承后的访问属性会作修改。

继承时的访问控制

(1)先看调用语句在子类内部还是外部,

(2)再看子类如何从父类继承 (public , protected , private)

(3)看父类中的访问级别(public , protected , private)

私有成员无论何种继承都不能被子类使用

public 继承时:

父类成员的访问属性对子类来说不改变。即父类 public 成员子类内和外均能访问,而protected 成员在子类内能访问,外则不能访问 ,private 成员子类内也不能访问

private 继承时:

父类成员的访问属性在子类中都变成 private 属性 ;(父类的public 成员在子类中能用,子类外不能用,protected 成员在子类内部能用,子类外不能用)

protected 继承时 :

 父类public 成员在子类的内部能用 ,外部不能用,而父类protected 成员在子类内部能用,外部不能用, private 成员在子类无论何种基础都不能使用。

子类对象可以当做父类对象使用

子类对象可以直接赋值发给父类对象

子类对象可以直接初始化父类对象

父类指针可以直接指向子类对象

父类引用可以直接引用子类对象

在继承时,子类构造函数需要调用父类构造函数(因为所继承的父类的私有成员是无法访问的,所以必须调用父类构造函数来初始化)

继承与组合混搭情况下,构造和析构调用的顺序。

原则, 先构造父类,再构造成员变量(类成员),最后构造自己;

    先析构自己,再析构成员变量(类成员),最后析构父类。

1 当子类成员变量与父类成员变量相同时,依然继承父类的同名成员。 

2在子类中通过作用域解析符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)

3同名成员存储在内存中不同的位置。

4 默认情况下是调用子类中的成员

同名成员函数类似

对于static成员变量,必须在类定义外进行初始化(更重要的是告诉C++编译器要求分配内存),如果没有进行初始化,则在继承时,如果出现调用该成员变量的时候就会出现问题(不使用时编译器不会报错)。

多继承 class a : public A ,public B { } ;

1多继承时可能会存在二义性。eg .  b1 b2均是继承于b,c多继承于b1与b2 ,此时会不知道到底从哪里继承b(有两份)。(即 一个派生类派生与多个类,这多个类种又有共同的基类

解决办法是使用虚继承 ,  class a : virtual public A , virtual public B { } ;

2而当继承的多个类没有共同的父类时,所产生的二义性则不能用虚继承解决。需要自己手动解决。

1>即使用作用域解析符区分。

2>在该类中再定义相同的函数,覆盖所继承的类中的函数。

虚继承和普通继承不同之处还在于,所占的内存空间大小是不一样的。加上virtual 了以后,C++编译器会给变量偷偷加上一些属性。

转载请注明原文地址: https://www.6miu.com/read-1600201.html

最新回复(0)