- 博客主页:https://loewen.blog.csdn.net
- 欢迎点赞 收藏 ⭐留言 如有错误敬请指正!
- 本文由 丶布布原创,首发于 CSDN,转载注明出处
- 现在的付出,都会是一种沉淀,只为让你成为更好的人✨
派生类:在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
继承 、 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
方法只适合子类和父类中的函数同名不同参数情况,可通过该方式调用父类同名函数;若子类和父类中的函数同名同参数情况,则还需使用方法一;
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |