c++ - 我怎样才能最好地在 C++ 中的不完整类型上使用多态性

标签 c++ polymorphism circular-dependency incomplete-type

我已经在 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 的定义可用。

关于c++ - 我怎样才能最好地在 C++ 中的不完整类型上使用多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16458729/

相关文章:

c++ - 如何将 ASCII 字符串转换为十六进制?

java - Maven 禁止循环包依赖

C++ 包含和循环依赖

c# - view, presenter 和 interface 之间的依赖关系

c++ - 继承和重载默认构造函数

c++ - 如何编写要在 main() 获得控制权之前执行的代码?

c++ - boost::program_options 位置选项

objective-c - 当方法可以返回子类时,返回类型应该是什么?

haskell - 什么是单态性限制?

ios - 游戏类的 Objective C 多态性