2

我一直在看 stackoverflow 和 google 一段时间,但我似乎无法找到关于循环引用、不完整类型和多态性的具体问题的答案。

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

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

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

在顶部的头文件中:

#pragma once

并在 C++ 文件顶部的某处用于 CTwo:

class COne;

现在遇到的问题是,由于类型不完整,编译器似乎不知道COne是从BaseOne派生的。所以在一个返回类型为 BaseOne* 的函数中,我想返回一个 COne*,这应该是可能的,因为它是一个向下转换,但它说它们不是同一类型。我现在使用 C 风格的演员修复了这个问题

return (BaseOne*)m_c_one;

我想问的是:有没有比使用 C 风格转换更好的方法来解决这个问题?

4

1 回答 1

1

C 风格的转换是不安全的,因为不能保证COne对象及其BaseOne子对象具有相同的内存地址(如果COne是标准布局类 (9p7),则可以保证,但这通常会排除多态性)。

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

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

您将不得不将强制转换移动到源文件中的定义COne可用的点,或者编写自己的强制转换函数BaseOne *to_base(COne *),并在源文件中的定义COne可用的点处实现。

于 2013-05-09T10:07:33.580 回答