访问等级(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;
}
程序运行后结果如下所示: