我一直在寻找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
定义的点。