C++ 第四次作业:继承

C++第四次作业:继承

在我们使用类的时候,有的时候会发现自己需要的两个类中会出现若干个相同的成员数据,那么这种时候能不能将所有相同的成员数据都写在一个类中,然后再在别的类中再进行完善和优化呢,答案当然是可以的,这就要用到类的继承,继承允许我们在保持原有类特性的基础上,进行更具体,更详细的的类的定义,从而更加高效的改造和扩充自己的软件,那么下面就举出实际的例子来说明类的继承

#include<iostream>
using namespace std;
class person {
private: int id, age;
public:
	person() { id = 15; age = 20; }
	void show() {
		cout << id << endl << age << endl<<endl;
	}
};
class student {


private: int id, age;
		 int num, score;
public:  student() { id = 15; age = 20; num = 30; score = 70; }
		 void print() {
			 cout << id << endl << age << endl << num << endl << score << endl;
		 }

};
int main()
{
	person a;
	student b;
	a.show();
	b.print();
}

如同上面这段c++代码。它定义了两个类,仔细观察后会发现两个类中存在相同的数据成员 id 和age,进行相应的赋值后会得到如上图所示结果,那么如果我们采用类的继承后就会得到如下代码(三种继承方式会一一介绍)

public继承

#include<iostream>
using namespace std;
class person {
private: int id, age;
public:
	void set(int a, int b) { this->id = a; this->age = b; }
	void show() {
		cout << id << endl << age << endl;
	}
};
class student:public person {
private: 
		 int num, score;
public:  student() {  num = 30; score = 70; }
		 void print() {
			 cout << num << endl << score << endl;
		 }

};
int main()
{
	
	student a;
	a.set(15, 20);
	a.show();
	a.print();
}

如上图所示的代码,在这里采用了public继承,这让子类即类student可以访问基类person的protected成员和public成员但是却不可以访问基类的private成员,所以在这里我在基类中设置了函数set并将其放在public中,这样我们就可以通过子类访问该函数从而让原来不可访问的private成员得到我们的访问与控制。

protected继承

#include<iostream>
using namespace std;
class person {
private: int id, age;
public:
	person() { id=10; age=20; }
	void show() {
		cout << id << endl << age << endl;
	}
	int back() {   return id; }
	int back2() {  return age; }

};
class student:protected person {
private: 
		 int num, score;
public:  student() {  num = 30; score = 70; }
		
		 
		 int back3() { return back(); }
		 int back4() { return back2(); }
		 void print() {
			 cout <<num << endl << score << endl;
		 }

};
int main()
{
	int c,d;

	student a;
	c = a.back3();
	d = a.back4();
	cout << d<<endl<<c << endl;
	a.print();
}

再进行protected继承后基类的保护成员和共有成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问,这样继承后,在类的外部通过派生类的对象就无法直接访问基类中public或者protected数据而要通过中间函数进行访问,对数据进行相应的赋值后会得到如上图所示的结果。

private继承

private继承后基类中公有成员与保护成员都以私有成员的身份出现在派生类中,而基类的私有成员也是不可以被派生类所访问的,所以私有继承后,派生类的成员可以直接访问保护与公有成员,但是无论通过派生类的对象还是成员都无法直接访问基类私有成员

#include<iostream>
using namespace std;
class person {
private: int id, age;
public:
	person() { id=10; age=20; }
	void show() {
		cout << id << endl << age << endl;
	}
	int back() {   return id; }
	int back2() {  return age; }

};
class student:private person {
private: 
		 int num, score;
public:  student() {  num = 30; score = 70; }
		
		 
		 int back3() { return back(); }
		 int back4() { return back2(); }
		 void print() {
			 cout <<num << endl << score << endl;
		 }

};
int main()
{
	int c,d;

	student a;
	c = a.back3();
	d = a.back4();
	cout << d<<endl<<c << endl;
	a.print();
}

这段代码和上一段代码为了方便我均都没有在类外部对基类进行访问,所以只是修改了继承的方式其他的仍然与继承函数一样,运行结果也是相同的,详情可看上一张图片,但是私有访问因为进一步派生后实际就相当于终止了基类功能的继续派生,所以这种继承方法不经常使用也不推荐使用。

作业总结

1:对于公有继承来说派生类可以访问基类成员中的公有成员以及保护成员,并且基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见。而且对我来说这应该是是最经常使用的一种继承方式,也是较为方便快捷的继承方式。

2:对于私有继承来说,基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。
所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。并且再进行进一步继承的时候就等于终止了基类功能的继续派生,所以这种继承的方法在实际使用中并不是特别常用,也不是很推荐使用

3:对于保护继承来说这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私有成员。(加粗部分来自百度百科)
基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的,所以它的实用性也是不如公有继承。

以上来自个人理解,如有错误请斧正。

posted @ 2019-10-12 08:43  不见风雨不见你  阅读(265)  评论(0编辑  收藏  举报