您的位置:首页 > 编程语言 > C语言/C++

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而导致歧义。

因此,应该只有标准答案那种情况(我是这样认为的)。

以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: