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;
相关推荐
门前云梦1 小时前
《C语言·源初法典》---C语言基础(上)
c语言·开发语言·学习
achene_ql1 小时前
select、poll、epoll 与 Reactor 模式
linux·服务器·网络·c++
sjtu_cjs2 小时前
Tensorrt python api 10.11.0笔记
开发语言·笔记·python
哆啦A梦的口袋呀2 小时前
深入理解系统:UML类图
开发语言·python·uml
虎冯河2 小时前
怎么让Comfyui导出的图像不包含工作流信息,
开发语言·python
coding随想3 小时前
JavaScript中的原始值包装类型:让基本类型也能“变身”对象
开发语言·javascript·ecmascript
SY师弟3 小时前
51单片机——计分器
c语言·c++·单片机·嵌入式硬件·51单片机·嵌入式
wuqingshun3141593 小时前
蓝桥杯 冶炼金属
算法·职场和发展·蓝桥杯
2301_794333913 小时前
Maven 概述、安装、配置、仓库、私服详解
java·开发语言·jvm·开源·maven