c++:类的继承与派生知识要点

  • 继承和派生

    1. 继承定义:类的继承,是新的类从已有的类哪里得到已有的特性,原有的类称为基列或父类,产生的新类称为子类或派生类。
    2. 派生的定义:从已有的类产生新类的过程就是类的派生
    3. 派生继承的分类: a.单继承:一个派生类只有一个直接基类的情况 b. 多继承: 一个派生类同时有多个基类的情况 c.菱形继承:A有两个继承的派生B,C,然后B,C在派生出D(此继承容易出现二义性) 注意:派生类继承处了基类的构造函数和析构函数外其他的成员函数和数据成员
    4. 派生类生产过程: a.吸收基类成员 b. 改造基类成员 c. 添加新的成员
    5. 继承方式: 公有继承 私有继承 保护继承
      公有继承:(public)
  • pubic---->public 对象访问(yes), 成员访问(Yes)

  • private---->private 对象访问(no) 成员访问(no)

  • protected—>protected 对象访问(no) 成员访问(Yes)

    私有继承: (private)

  • public---->private 对象访问(no), 成员访问(Yes)

  • pritected----->privae 对象访问(no),成员访问(Yes)

  • private---->private 对象访问(no),成员访问(no)

    保护继承 : (protected)

  • public---->protected 对象访问(no),成员访问(Yes)

  • protected—>protected 对象访问(no),成员访问(Yes)

  • privae—>privae 对象访问(no),成员访问(no)

对象访问:在主函数中通过类的对象来访问派生类的成员函数, 如: Student stu ; stu.showpaly();
成员访问: 在类里面通过初始化来访问各个类成员
6. 类型兼容规则
类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。
类型兼容规则中所指的替换包括以下的情况

  • 派生类的对象可以隐含转换为基类的对象
  • 派生类的对象可以初始化为基类的引用
  • 派生类的指针可以隐含转换为基类的指针
    例子如下:
#include
using namespace std;
class Base1{
	 public:
	 	 void display() const {const<<"Base1::display()"<<endl;}
}; 
class Base2:public Base1{//公有继承 
     public:
	     void display() const {cout<<"Base2::display()"<<endl; }
};
class Derived:public Base2{//公有派生类Derived定义
     public: 
	      void display() const {cout<<"Derived::display()"<<endl; } 
};
void fun(Base1 *ptr){//参数为指向基类对象的指针 
	 ptr->display();//对象指针->成员名 
} 
int main(){
	 Base1 base1;//声明Base1类的对象
	 Base2 base2; //声明Base2类的对象
	 Derived derived;//声明Derived类的对象
	 fun(&base1);//用Base1对象的指针调用fun函数 
	 fun(&base2);//用Base2对象的指针调用fun函数 
	 fun(&derived);// 用Derived对象的指针调用fun函数
	 return 0; 
} 
  • 派生类的构造函数和析构函数

注意: a.在构造派生类的对象时,就要对基类的成员对象和新增成员对象进行初始化
b. 如果对基类初始化时,需要调用基类的带有形参表的构造函数时,派生类就必须声明构造函数
c.派生类构造函数执行的一般次序
1. 调用基类构造函数,调用顺序按照他们被继承时声明的顺序(从做到右)
2. 对派生类新增的成员对象初始化,调用顺序按照他们在类中声明的顺序
3. 执行派生类的构造函数体中的内容

  • 菱形继承中的问题二义性解决方法
    1. 可以通过作用域分辨符来限定
    2. 可以通过虚继承virtual 来解决

你可能感兴趣的:(c++基础知识)