访问等级(public、private和protected)

public:可以被对象在任何函数体中访问。

private:只允许本类的成员函数访问。

protected:只允许本类成员函数和子类成员函数访问。

继承:公有继承、私有继承和保护继承

公有继承(class B:public A):

子类对象可以访问父类中的公有成员(即公有成员变量和成员函数),子类的成员函数可以访问父类的公有和保护成员(即保护成员变量和成员函数)。

私有继承(class B:private A):

父类的公有成员和保护成员作为子类的私有成员,不能被孙类访问,即不能被往下继承。

保护继承(class B:protected A):

子类的成员函数可以访问父类的公有成员(即公有的成员变量和成员函数)和保护成员(即保护的成员变量和成员函数),以及父类的公有成员和保护成员作为子类的保护成员,保护成员还可以被孙类访问。

下面举例子进行讲解:

在C++工程创建两个文件,student.h头文件为类的声明,student.cpp文件为类构造函数和成员函数初始化。

student.h头文件类声明程序如下:

#ifndef __STUDENT_H__
#define __STUDENT_H__
#include <iostream>
#include<string.h>

using namespace std;

class student
{
private:
    char name[20];//成员变量
    int  age;//成员变量
    int  num;//成员变量
public:
    student();//无参构造函数
    student(const char *stuName,int stuAge,int stuNum);//带参构造函数
    virtual ~student();//析构函数
    char* GetStuName();//获取学生姓名
    int GetStuAge();   //获取学生年龄
    int GetStuNum();   //获取学生学号

    void SetStuName(const char *stuName);//姓名设置
    void SetStuAge(int stuAge);//年龄设置
    void SetStuNum(int stuNum);//学号设置
};

#endif // !__STUDENT_H__

student.cpp文件程序如下:

#include"student.h"

using namespace std;

//无参构造函数
student::student()
{
	memset(name,0,sizeof(name));
	age = 0;
	num = 0;
	cout << "执行了student::student()构造函数" << endl;
}

//带参构造函数
student::student(const char* stuName, int stuAge, int stuNum):age(stuAge),num(stuNum)
{
	memcpy(name,stuName,strlen(stuName)+1);
}

//获取学生姓名
char* student::GetStuName()
{
	return  name;
}

//获取学生年龄
int student::GetStuAge()
{
	return age;
}

//获取学生学号
int student::GetStuNum()
{
	return num;
}

//设置学生姓名
void student::SetStuName(const char* stuName)
{
	memcpy(name, stuName, strlen(stuName) + 1);
}

//设置学生年龄
void student::SetStuAge(int stuAge)
{
	age = stuAge;
}

//设置学生学号
void student::SetStuNum(int stuNum)
{
	num = stuNum;
}

//析构函数
student::~student()
{
	cout << "执行了student::~student()虚构函数" << endl;
}

在C++工程再创建两个文件,primary.h头文件为primary类继承student类的声明,primary.cpp文件为类构造函数和成员函数初始化。

primary.h头文件类声明程序如下:

#pragma once
#ifndef __PRIMARY_H__
#define __PRIMARY_H__

#include <iostream>
#include<string.h>
#include"student.h"

using namespace std;

class primary :public student//子类继承父类
{
private:
    int Chinese;//增加了两门课程:语文和数学
    int Math;
public:
    primary();//无参构造函数
    primary(const char* stuName, int stuAge, int stuNum,int stuChinese, int stuMath);//带参构造函数
    void hobby();//增加一个爱好
    virtual ~primary();//析构函数
    int GetChineseScore();//获取语文成绩
    int GetMathScore();//获取数学成绩
    void SetChineseScore(int stuChineseScore);//修改语文成绩
    void SetMathScore(int stuMathScore);//修改数学成绩

};

#endif

primary.cpp文件程序如下:

#include"student.h"
#include"primary.h"

using namespace std;

//子类primary无参构造初始化
primary::primary()
{
	cout << "执行了primary::primary()构造函数" << endl;
}

//子类primary带参构造函数初始化(初始化列表):父类初始化(初始化列表,从子类对象获取参数)
primary::primary(const char* stuName, int stuAge, int stuNum, int stuChinese, int stuMath):student(stuName, stuAge, stuNum),Chinese(stuChinese),Math(stuMath)
{

}

//子类primary成员函数初始化
void primary::hobby()
{
	cout << "Likes playing basketball and swimming!" << endl;
}

//子类primary虚构函数初始化
primary::~primary()
{
	cout << "执行了primary::~primary()虚构函数" << endl;
}

//用成员函数GetChineseScore获取private修饰的Chinese值
int primary::GetChineseScore()
{
	return Chinese;
}

//用成员函数GetMathScore获取private修饰的Chinese值
int primary::GetMathScore()
{
	return Math;
}

//设置语文成绩
void primary::SetChineseScore(int stuChineseScore)
{
	Chinese = stuChineseScore;
}

//设置数学成绩
void primary::SetMathScore(int stuMathScore)
{
	Math = stuMathScore;
}

在main主函数中创建子类primary指针,指向primary对象并调用父类和子类的成员,程序如下所示:

int main()
{
	primary* stu = new primary("xiaofeng",20,1001,95,85);

	cout << stu->GetStuName() << endl;
	cout << stu->GetStuAge()  << endl;
	cout << stu->GetStuNum()  << endl;
	cout << stu->GetChineseScore() << endl;
	cout << stu->GetMathScore()    << endl;
	stu->hobby();

	cout << endl;//回车换行

	stu->SetStuAge(45);
	stu->SetStuName("xiaoyuanshan");
	stu->SetStuNum(2001);
	stu->SetChineseScore(100);
	stu->SetMathScore(95);
	cout << stu->GetStuName() << endl;
	cout << stu->GetStuAge() << endl;
	cout << stu->GetStuNum() << endl;
	cout << stu->GetChineseScore() << endl;
	cout << stu->GetMathScore() << endl;
	stu->hobby();

	delete stu;
	return 0;
}

程序运行后结果如下所示:

springboot 子类如何调用父类的属性 this 子类调用父类protected属性_子类