C++:由输出推断继承关系

本文通过一道实验课题目,讲解如何根据输出推断C++中类A, B, C, D, E之间的继承关系。文章讨论了构造函数和析构函数的执行顺序,并列举了可能的继承方案,最终得出标准答案:E -> C -> D:E, C -> A:C, B:D, A。还分析了其他情况为何无法实现,因为会出现路径歧义导致编译错误。" 122932012,7800548,Python时间序列可视化:误差带与均值标准差,"['Python', '数据挖掘', '机器学习', '数据可视化', '人工智能']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值