虚继承 – C++快速入门29

虚继承让编程改变世界Change the world by program虚继承前一节的 student 示例程序看起来似乎已经解决了问题,但它存在着一些隐患。首先,在 TeachingStudent 类的 introduce() 方法里,我们不得不明确地告诉编译器应该使用哪一个属性。这对于 classes 属性来说是应该的,因为教一门课和上一门课有着本质的区别

虚继承

让编程改变世界

Change the world by program

虚继承

前一节的 student 示例程序看起来似乎已经解决了问题,但它存在着一些隐患。

首先,在 TeachingStudent 类的 introduce() 方法里,我们不得不明确地告诉编译器应该使用哪一个属性。

这对于 classes 属性来说是应该的,因为教一门课和上一门课有着本质的区别,而作为常识,助教生教的课程和他学的课程不可能一样!

但是我们再深入考虑下,既然在 TeachingStudent 对象里可以继承两个不同的 classes 属性,那它是不是应该有两个不同的 name 属性呢?

答案:是!

事实上,TeachingStudent 还真可以有两个不同的名字,这肯定不是我们在设计这个类继承模型时所预期的:Example1.cpp(课件及源代码)

TeachingStudent 类继承自 Teacher 和 Student 两个类,因而继承了两组 Person 类的属性,这在某些时候完全有道理,例如 classes 属性。

但它也有可能引起麻烦,例如发生在 name 属性身上的情况。

C++ 发明者也想到了这部分的冲突,因此为此提供了一个功能可以解决这个问题:虚继承(virtual inheritance)

通过虚继承某个基类,就是在告诉编译器:从当前这个类再派生出来的子类只能拥有那个基类的一个实例。

虚继承的语法:

class Teacher : virtual public Person

{

}

这样做我们的问题就解决了:让 Student 和 Teacher 类都虚继承自 Person 类,编译器将确保从 Student 和 Teacher 类再派生出来的子类只能拥

有一份 Person 类的属性!

栗子修改:Example2.cpp(课件及源代码)

下节课预告

接下来我们会 hold 住我们的课程先,讲讲关于 ”错误处理和调试” 的内容。

大家也许会问:为什么等到现在才开始讨论错误处理和调试?不是一开始就应该讲这些的吗?

小甲鱼的回答是:不是小甲鱼健忘,而是想要获得这方面的知识和经验,任何手段也比不上你的亲身实践。

避免错误的方法是什么?

永远也不重复犯同样的错误!但这事不可能的!

如果你是一个孜孜不倦、勤奋向上的好童鞋,就应该明白这样一个道理:每个错误都是一个学习如何在今后不继续犯错的好机会!

总而言之,如果在课程一个开始给大家讲这个,这些内容或许只会出现在大家笔记本,最后以一斤三毛钱的价格卖给了收破烂的。

下节课,我们将会讨论一些技巧,并希望它们能帮助大家调试好程序。

视频下载

备用视频下载
技术, IT技术, CPP, 视频教程