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;
相关推荐
迷途之人不知返8 分钟前
算法系列2:滑动窗口
算法
IT爱学堂8 分钟前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
有点。9 分钟前
C++认识数
开发语言·c++
Herbert_hwt17 分钟前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
2023自学中42 分钟前
Qt 简易聊天室(第二篇),单线程 改为 多线程,方便后续增加文件传输功能
c++·qt
W_326001 小时前
Python文件进阶:一维数据与 CSV 文件读写
开发语言·python
Tyler_TXZ2 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
Tisfy2 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-2 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。2 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论