C++继承与多态(一)

来源:互联网 发布:网络枪支案件判刑 编辑:程序博客网 时间:2024/05/22 03:46
一、继承相关概念
    1.继承:继承是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享共有的东西,实现各自本质不同的东西。

    2.成员访问限定符与继承的关系
      

       继承是一种复用手段,在继承关系里基类继承派生类的成员,由此打到复用目的。
       三种继承关系下基类成员在派生类的访问关系变化
       

总结:
       1)基类的私有成员(private)在派生类中是不能被访问的,如果一些积累成员不想被基类对象直接访问,但需要在派生类中能访问,就定义为保护成员。保护成员限定符是因继承才出现的
       2)public继承是一个接口继承,保持is-a原则,每个父类可用的成员变量子类也可以用,因为每个子类对象也都是一个父类对象。
       3)protect/private继承是一个实现继承,基类的部分成员并未完全成为子类接口的一部分,是has-a的原则,一般情况下使用共有继承。
       4)无论哪种继承方式,在派生类内部都可以访问基类的公有成员和保护成员,但是基类的私有成员存在但是在子类中不可见,不能访问
       5)使用关键字class默认继承方式是private,使用struct时默认继承方式是public
       6)实际运用中一般使用public继承。

       3.继承与转换(赋值兼容规则-public继承)
       1)子类对象可以赋值给父类对象(切片/切割)
       2)父类对象不能赋值给子类对象
       3)父类的指针/引用可以指向子类对象
       4)子类的指针/引用不可以指向父类对象(可强转)

       4.继承体系中的作用域
       1)在继承中基类和派生类都有独立的作用域。
       2)子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问。
       隐藏/重定义:子类中定义了和父类同名的成员。
       可以调用父类成员用作用域解析符来访问父类成员。
       3)注意在实际中最好不要定义同名成员。

二、派生类的默认成员函数
       
1.构造函数
       合成构造函数:派生类只初始化自己的成员,父类部分调用父类的构造函数进行初始化。
Student(const char*name,int num)  :Person(name)//调用父类构造函数  ,_num(num){}
2.拷贝构造函数
//s2(s1)
Student(const Student& s)  :Person(s)  ,_num(s._num){}
3.值操作符重载
//s2=s1
Student& operator=(const Student& s){   if(this!=&s)   {      Person::operator=(s);      _num=s._num;   }   return *this;}

4.析构函数
       不需要显式调父类,父类的析构函数是子类析构函数完成后自动调用的。

三、单继承和多继承
       1.单继承:一个子类只有一个直接父类
       2.多继承:一个子类有两个或两个以上直接父类
       
       菱形继承
       

       菱形继承会存在二义性和数据冗余的问题
//解决二义性,没有解决数据冗余Assistant a;a.Student::_name="wo"a.Teacher::_name="ni"
       虚继承:解决菱形继承的二义性和数据冗余的问题
       

原创粉丝点击