我一直在寻找stackoverflow和google已有一段时间了,但是我似乎找不到关于循环引用,不完整类型和多态性的特定问题的答案。

希望我能在不发布大量代码的情况下解释这个问题,但是如果失败,请告诉我,我将尝试写下一个简单的示例。

我有2个类,它们都互相使用(比如类COne和CTwo)。此外,COne类具有基类(例如BaseOne)。

我使用 header 保护符(如果您称呼它们)和不完整的类型来“解决”循环依赖问题。

在顶部的头文件中:

#pragma once

在CTwo的C++文件顶部的某个位置:
class COne;

现在,我遇到一个问题,由于类型不完整,编译器似乎不知道COne是从BaseOne派生的。
因此,在具有返回类型BaseOne *的函数中,我想返回一个COne *,这应该是可能的,因为它是一个垂头丧气的东西,但是它说它们不是同一类型。
我现在使用C风格的投射修复了此问题
return (BaseOne*)m_c_one;

我想问的是:是否有比使用C样式转换更好的方法来解决此问题?

最佳答案

C样式强制转换是不安全的,因为不能保证COne对象及其BaseOne子对象具有相同的内存地址(可以保证COne是标准布局类(9p7),但通常会阻止多态性)。

编译器需要COne完整才能执行强制转换(3.2p5),因为COne可以使用虚拟或多重继承,并且通常因为不需要多态类具有简单的内存布局。

struct COne: BaseZero, BaseOne { ... };
struct COne: virtual BaseOne { ... };

您将不得不将强制转换移动到源文件中可以使用COne定义的点,或者将自己的强制转换函数BaseOne *to_base(COne *)与实现一起写入源文件中可以使用COne定义的点。

08-27 17:35