C++:由输出推断继承关系
2016-03-30 00:42
197 查看
C++:由输出推断类之间继承关系
标签: C++ 继承by 小威威
本文主要是对实验课的“Easy Inheritance”的讲解。
题目如下: (Author: 欧文杰(TA))
This is the easiest problem I have met! (真心想吐槽这句话!!!)
There are 5 classes A, B, C, D, and E.
Each class has the following form (X stands for the name of the class):
Find out the appropriate inheritance relationship between class A, B, C, D, and E.
With the following main function, we can get the sample output.
Your submitted source code should include the whole implementation of the 5 classes.
Submit the ABCDE.cpp
Sample input: #include <iostream> #include "ABCDE.cpp" using namespace std; int main() { B b; return 0; } Sample output: In E() In C() In D() In C() In A() In B() In ~B() In ~A() In ~C() In ~D() In ~C() In ~E()
首先,这道题是没有任何实际意义的,它是为了知识点而出的一道题。这道题主要考察的知识点是:
类的构造函数与析构函数的执行的顺序。
类的构造函数执行顺序是:
1.根据继承从左到右的先后关系,依次先执行父类的构造函数;
2.对于一个组合类,应根据从上到下的先后关系,依次执行本类中其他类成员的构造函数;
3.最后才执行本类的构造函数。
而析构函数执行顺序与构造函数的执行顺序相反!(可以运用栈的思想去理解)
好,我们现在开始推断。
从输出可以看到,最先执行的是E的构造函数,很容易知道E并不继承任何类,因此它就是一个独立类。第二个执行的是C的构造函数,我们不清楚C是否有继承E。那么我们就先假设C继承了E,然后我们继续看输出,发现输出中有第二个C。倘若C继承了E,那么在第二个C出现之前应该先出现E,然而事实并非如此。因此,C也是一个独立类,它并不继承任何类。好我们继续看输出。第三个执行的是D的构造函数,不难判断D肯定是继承C与D的。因为C、D都是独立类,不可能自动执行构造函数。再接着看,D的下面是第二个C,要执行C的构造函数,很容易想到是A来引发的,即是A继承了C,然后为了引发D、A,不难想到B继承D、A。这是比较容易想到的,也是本题的标准答案。也许有些同学会有疑问,会不会有其他情况出现呢?
因此我自己推断了下,列出以下三种情况:(不一定全,但只能想到这几种情况):
第一种:
E
C
D:E C
A:D C
B:A
第二种情况(标准答案):
E
C
D:E C
A:C
B:D A
第三种情况:
E
C
D:E C
A
B: D C A
但是,虽然我多写了两种情况,看似逻辑上行得通,但是实际上是不能实现的(除非用虚继承)
先来看第一种情况,看到A的继承。
调用A的构造函数之前要先调用D的构造函数,要调用D的构造函数就得先调用E、C的构造函数,这时问题就来了,A的继承中出现了两个C的子对象,即是A::D::C 与 A::C。编译时系统会提示出错,错误信息如下:
Inheritance.cpp:39:7: warning: direct base ‘C’ inaccessible in ‘A’ due to ambiguity class A : public D, public C { ^ In file included from main.cpp:2:0: Inheritance.cpp:39:7: warning: direct base ‘C’ inaccessible in ‘A’ due to ambiguity class A : public D, public C { ^
编译器提示A中的C存在歧义,也就是说A::D::C 与 A::C两者会导致歧义。根据网上的观点,这是因为A::C路径也能够访问A::D::C。因此当路径为A::C是编译器不知道要访问那个C所以导致编译出错。
其实第三种情况也是同样的道理。 B中也会出现两个路径长度不同的C而导致歧义。
因此,应该只有标准答案那种情况(我是这样认为的)。
以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!
相关文章推荐
- c++引用深入分析
- 将数组a中的n个整数按相反顺序存放
- 如何产生一个不重复的随机数
- 【C/C++】计算两个整数的最大公约数和最小公倍数
- Effective C++: 模板类型推断.
- Effective C++: auto类型推断.
- C++浓缩(五)
- C++字符串
- gdal vc++ 配置说明
- 2015年蓝桥杯C组C/C++题目:格子中输出
- 20160228.CCPP体系详解(0038天)
- 2015年蓝桥杯C组第二题:立方尾不变
- 设计模式--门面模式C++实现
- C++ STL 中lower_bound() 和 upper_bound()讲解
- C语言中static的作用
- c++第二次实验项目一
- KMP算法研究(一)
- error LNK2019,cpp文件调用C代码
- [C++]class内的static方法指针
- Visual Studio中的环境变量(以Visual Studio 2013为例)