C++ //练习 18.29 已知有如下所示的类继承关系:

C++ Primer(第5版) 练习 18.29

练习 18.29 已知有如下所示的类继承关系:

cpp 复制代码
class Class { ... };
class Base: public Class { ... };
class D1: virtual public Base { ... };
class D2: virtual public Base { ... };
class MI: public D1, public D2 { ... };
class Final: public MI, public Class { ... };
( a ) 当作用一个Final对象时,构造函数和析构函数的执行次序分别是什么?
( b ) 在一个Final对象中有几个Base部分?几个Class部分?
( c ) 下面的哪些赋值运算符将造成编译错误?
Base *pb; Class *pc; Mi *pmi; D2 *pd2;
( a ) pb = new Class;		( b ) pc = new Final;
( c ) pmi = pb;				( d ) pd2 = pmi;
环境:Linux Ubuntu(云服务器)
工具:vim
解释
cpp 复制代码
class Class { ... };
class Base: public Class { ... };
class D1: virtual public Base { ... };
class D2: virtual public Base { ... };
class MI: public D1, public D2 { ... };
class Final: public MI, public Class { ... };

( a ) 当作用一个Final对象时,构造函数和析构函数的执行次序分别是什么?
类构造函数:由于 Base 继承自 Class,并且 D1 和 D2 都虚继承自 Base,因此首先构造 Class。
Base 构造函数:由于 D1 和 D2 虚继承自 Base,因此只构造一个 Base 对象,并且构造过程在 Class 构造函数之后。
D1 构造函数:初始化基类后,构造 D1。
D2 构造函数:然后构造 D2。
MI 构造函数:在 D1 和 D2 之后,调用 MI 构造函数。
类构造函数(再次):由于 Final 也直接继承自 Class,因此对于 Final 中的 Class 部分,再次调用此构造函数。
Final 构造函数:最后,执行 Final 构造函数。

( b ) 在一个Final对象中有几个Base部分?几个Class部分?
Base 部分的数量:
Final 对象中有一个 Base 部分。这是因为 D1 和 D2 实际上继承了 Base,这导致 MI 中存在一个共享的 Base 子对象,因此 Final 中也是如此。

Class 部分的数量:
Final 对象中有两个 Class 部分:
Base 继承的 Class 部分,由 D1 和 D2 通过 Base 共享。
Final 直接继承的附加 Class 部分。

( c ) 下面的哪些赋值运算符将造成编译错误?
Base *pb; Class *pc; Mi *pmi; D2 *pd2;
//错误
( a ) pb = new Class;
//正确
( b ) pc = new Final;
//错误
( c ) pmi = pb;
//正确	
( d ) pd2 = pmi;
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
weilx12345 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛5 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·5 天前
C++ 萌新语法入门篇
c++·算法比赛