一. 派生类概念
派生类:在C++
中,继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为「基类」,又称为「父类」;新建立的类称为「派生类」,又称为「子类」。
继承:「派生类」从已有的「基类」那里获得其相关特性(一些公用的成员变量和成员函数),这种现象称为类的继承。「继承」是面向对象程序设计的核心思想之一。好处:可以减少代码量,这样在写派生类的时候,只写与派生类相关的成员变量和成员函数即可,公用的相关功能可以直接从基类中继承使用。
继承的书写格式:class
子类名
:
继承方式(public/protected/private)
父类名
举例:
class Human //父类 { public: Human(); Human(int &a); ~Human(); void print(){ std::cout << "执行了Human的成员函数print()" << std::endl; } public: int m_age; //年龄 char m_name[100]; //名字 };
#include "Human.h" class Man : public Human //继承:表示Man是Human的子类 { public: Man(); ~Man(); private: int m_num; };
#include "Human.h" #include "man.h" int main() { Man man; //定义一个子类的对象 man.print(); //通过<对象.>的方式可以调用父类的函数print() man.m_num; //通过<对象.>的方式可以调用自己的变量 system("pause"); return 0; }
二. 派生类对象定义时,调用构造函数的顺序
继续上面的来:
Human::Human() { std::cout << "执行了Human::Human()默认构造函数" << std::endl; }
Man::Man() { std::cout << "执行了Man::Man()默认构造函数" << std::endl; }
int main() { Man man; / //当定义子类对象时,父类的构造函数也会调用的 system("pause"); return 0; }
可以看出,当定义子类Man对象时,不仅仅调用了子类Man的构造函数,也调用了父类Human的构造函数,而且是先调用。
三. 继承方式
🐕 三种访问权限:
- public:可以被任意实体访问;
- protected:只允许子类及本类的成员函数访问;
- private:只允许本类的成员函数访问
🐪 三种继承方式:public
继承 、 protect
继承和private
继承
基类中的访问权限 | 子类继承基类的方式 | 子类得到的访问权限 |
public | & public继承 | public |
protected | & public继承 | protected |
private | & public继承 | 子类无权访问 |
public | & protected继承 | protected |
protected | & protected继承 | protected |
private | & protected继承 | 子类无权访问 |
public | & private继承 | private |
protected | & private继承 | private |
private | & private继承 | 子类无权访问 |
🐩 总结:
public
继承基类:不改变基类成员的访问权限;protected
继承基类:将基类中public
成员变为子类的protected
成员,其它成员的访问权限不变;private
继承基类:使得基类所有成员在子类中的访问权限变为private
;- 基类中的
private
成员不受继承方式的影响,子类永远无权访问; - 对于基类来讲,尤其是基类的成员函数,如果不想让外面访问,就设置为
private
;如果想让子类能够访问,就设置为protected
;如果想公开,就设置为public
;
四. 函数遮蔽
子类中如果有和父类一样的同名函数,那么子类对象则无法访问调用父类中的同名函数。
解决措施如下:
1、在子类的成员函数中,通过父类::同名函数来强制调用父类函数;
2、通过关键字using
让父类的同名函数在子类中可见;
ps:通过关键字using
方法只适合子类和父类中的函数同名不同参数情况,可通过该方式调用父类同名函数;若子类和父类中的函数同名同参数情况,则还需使用方法一;
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |