`
java-mans
  • 浏览: 11741609 次
文章分类
社区版块
存档分类
最新评论

C++学习之继承

 
阅读更多

继承:使程序代码的重用度大幅度地提高了,而C++对继承有很好的支持,

基类对象不能给子类对象赋值,因为基类中的数据不充分,不含有子类全部的信息,
但是子类对象可以给基类对象赋值。

如下图所示:

例如:
student是一类,GraduateStudent是student的子类,那么
GraduateStudent gs;
Student* p = &gs;

由于p是Student指针,指向GraduateStudent对象gs的首地址,它恰好也是其中Student对象部分的首地址。

因为研究生也是学生,所以研究生对象gs赋值给s也是合理的。它裁去了专属研究生的部分,而且将研究生对象的地址赋给学生指针p也是合理的,由于学生对象地址和研究生对象地址重合,所以,p指针若转换为研究生类型是:
GraduateStudent* pGs = reinterpret_cast<GraduateStudent*>(p);
便无需修改地址就可以操作研究生了,这种reinterpret_cast转换,纯粹是地址不变而指针类型改变,即指针操作的意义改变。但前提是学生对象与研究生对象地址重合。

1. 覆盖父类操作

如果父类中有一个操作,在子类中没有重新定义,则子类可以沿用该操作,但都是父类操作。例如下列程序中,研究生类GraduateStudent继承了Student类,对象gs在显示其本人信息时,没有办法显示相关的研究生信息。这主要是GraduateStudent类中没有重载display成员函数,为了准备使用GraduateStudent类,需要在GraduateStudent类中把父类中的display成员函数进行覆盖。

#include <iostream>
#include <string>
using namespace std;

class Advisor
{
	int noOfMeeting;
};

class Student
{
	string name;
	int semesterHours;
	double average;
public:
	Student(string pName = "noName")
	{
		name = pName;
		average = 0;
		semesterHours = 0;
	}
	void addCourse(int hours, double grade)
	{
		double totalGrade = (semesterHours * average + grade);
		semesterHours += hours;
		average = semesterHours ? totalGrade / semesterHours : 0;
	}
	void display()
	{
		cout << "name=\"" << name << "\"" << ", hours=" << semesterHours << ", average=" << average << endl;
	}

	int getHours()
	{
		return semesterHours;
	}
	
	double getAverage()
	{
		return average;
	}
};

class GraduateStudent : public Student
{
	Advisor advisor;
	int qualifierGrade;
public:
	GraduateStudent(string pName = "noName"):Student(pName)
	{

		qualifierGrade = 0;
	}

	int getQualifier()
	{
		return qualifierGrade;
	}

	void display()
	{
		Student::display();
		cout << "qualifierGrade=" << qualifierGrade << endl;
	}
};

int main()
{
	Student ds("Lo lee undergraduade");
	GraduateStudent gs("WU fantasy");
	ds.addCourse(3, 2.5);
	ds.display();

	gs.addCourse(3, 3.0);
	gs.display();

	return 0;
}


2. 同化效应

在上述代码中,GraduateStudent类继承了Student类,当以自己的身份表现时,显示了自身的特色。但是,当以研究生对象复制(传递)给学生时,研究生的个性消失了,如下代码所示:

void fun(Student& x)
{
	x.display();
}

int main()
{
	Student s("Lo lee undergraduate");
	GraduateStudent gs("John");
	fun(s);
	fun(gs);

	return 0;
}

代码输出如下:

name="Lo lee undergraduate", hours=0, average=0
name="John", hours=0, average=0

从输出结果可以看出,Student类对象s和GraduateStudent类对象gs作为参数传递给fun函数时,gs在fun函数中并不被看作为研究生,而被看作Student类对象进行操作。


分享到:
评论

相关推荐

    C++多继承Demo

    在C++编程语言中,多继承是一种特性,允许一个派生类从多个基类继承属性和行为。这个特性使得代码重用更为灵活,但同时也带来了潜在的问题,...通过学习和实践"**C++多继承Demo**",我们可以更好地理解和掌握这些概念。

    c++ 的封装继承多态例子

    在C++编程语言中,封装、...通过学习和实践这些例子,开发者能够更好地理解和掌握C++的面向对象编程技巧,从而编写出更高效、更易于维护的代码。在实际开发中,封装、继承和多态是设计模块化、可扩展系统的关键工具。

    c++继承分类

    C++继承是面向对象编程(OOP)中的一个核心概念,它允许我们创建新的类,这些新类可以...通过学习这个视频教程,你将更好地理解C++继承的概念,并能熟练地在Qt开发中应用这些知识,创建出功能丰富、结构清晰的程序。

    C++ 学习笔记 整理

    这份"C++学习笔记"涵盖了C++的基础到高级概念,旨在帮助初学者和有一定经验的程序员深入理解并掌握C++。 在C++的学习过程中,以下几个关键知识点是不可或缺的: 1. **基础语法**:C++起源于C语言,因此它保留了...

    c++学习课件ppt

    本“C++学习课件PPT”旨在为大二学生或其他初学者提供一个详尽的C++编程学习资源。 首先,C++的基础部分包括语法、变量、数据类型、运算符、流程控制(如if语句、switch语句、for循环、while循环)以及函数的使用。...

    C++学习实例,非常好的学习C++的小例子

    "C++学习实例"这个压缩包文件正是为初学者提供了一系列精心设计的练习,旨在帮助他们逐步理解并熟练运用C++。 首先,我们要了解C++的基本概念。C++是C语言的增强版,引入了面向对象编程(OOP)的概念,包括类、对象...

    C++学习书籍宝典

    总的来说,《C++学习书籍宝典》中的《C++面向对象程序设计》是初学者踏上C++编程之路的理想起点。通过系统的学习和不断的实践,读者将能够逐步掌握C++这一强大工具,为未来的编程生涯打下坚实基础。

    c/c++面试题(一些常出的面试题,包括多态,继承,函数参数等常考的内容)

    在C++中,多态性是面向对象编程的三大特性之一,另外两个是封装和继承。多态性允许不同的对象对同一消息做出不同的响应,实现灵活和通用的代码设计。C++支持两种类型的多态:静态多态(编译时多态)和动态多态(运行...

    C++类继承,访问权限,有源码参考

    通过以上知识点的学习,您可以理解并运用C++类继承来设计更高效、可维护的代码。如果在实践中遇到任何疑问,可以通过提供的源代码与作者沈继功联系,以获得进一步的帮助和指导。在实际编程中,理解和掌握这些概念将...

    C++ 虚继承对基类构造函数调用顺序的影响

    可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与普通继承的区别有:  假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;  ...

    C++学习 PPT《明日科技丛书》

    作为C++的学习资源,《明日科技丛书》中的C++学习PPT提供了深入理解这种语言的基础和进阶知识。 C++的核心特性包括面向对象编程(OOP)、模板、异常处理和STL(Standard Template Library,标准模板库)。以下是...

    c++编程思想 c++学习宝典 高清pdf格式

    《C++编程思想》是C++领域的经典之作,由Bruce Eckel撰写,旨在帮助程序员深入理解和掌握C++这一强大而复杂的编程语言。这本书分为多个章节,涵盖了C++的基础概念、核心特性以及高级主题,旨在系统地指导读者进行C++...

    c++学习材料资源丰富c++学习材料资源丰富c++学习材料资源丰富c++学习材料资源丰富c++学习材料资源丰富c++学习材料资源

    这份"丰富的C++学习材料资源"涵盖了学习C++所必需的各种资料,可以帮助初学者逐步掌握这个语言的核心概念和高级特性。 首先,C++的基础部分包括语法、数据类型、控制流(如if语句、循环)、函数、数组和指针等。...

    c++课程 PPT(继承与派生)

    讲述在c++中关于继承与派生的基础方法,用于初学者进行学习

    实现c++类的多重继承的例程

    在C++编程语言中,多重继承是一种特性,允许一个派生类从多个基类中继承属性和行为。这种设计模式增强了代码的复用性,并且能够构建复杂的类层次结构。以下是一个关于如何实现C++类的多重继承的详细解释。 首先,让...

    C++学习教程-PPT.zip

    本教程“C++学习教程-PPT.zip”旨在引导初学者逐步掌握C++的核心概念和技能。 C++起源于C语言,由Bjarne Stroustrup在1983年为了增强C语言的功能而设计。它不仅保留了C语言的高效性和灵活性,还引入了类、继承、...

    C++学习笔记.chm

    《C++学习笔记》是一部非常实用的资源,适合那些对C++编程语言有着浓厚兴趣或者正在学习C++的初学者。这份笔记详细介绍了C++语言的基础知识、核心概念以及高级特性,旨在帮助读者掌握C++编程的核心技能。 C++是...

    C++的学习感想

    ### C++的学习感想 在IT领域中,C++是一种被广泛应用且功能强大的编程语言,它不仅继承了C语言的基础语法特性,还引入了许多高级概念和技术,如面向对象编程(OOP)和模板编程等。本文将围绕“C++的学习感想”这一...

    C++学习心得和方向C++学习心得和方向

    通过创建类来抽象现实世界中的实体,利用继承实现代码复用,以及通过多态实现更灵活的设计,是C++强大之处。理解这些概念不仅有助于编写更高效、可维护的代码,也是面试中常被考察的点。 在C++中,内存管理是另一个...

    C++随堂测试(继承、多态、重载)(答案).docx

    C++随堂测试(继承、多态、重载) 本资源摘要信息涵盖了C++编程语言中三个重要的概念:继承、多态和重载。...本资源摘要信息涵盖了C++编程语言中继承、多态和重载三个重要概念的知识点,对于学习C++的读者非常有帮助。

Global site tag (gtag.js) - Google Analytics