如何在c++中最好地使用不完整类型上的多态性
How can I best use polymorphism on incomplete types in C++
我已经在stackoverflow和google上找了一段时间了,但我似乎找不到关于循环引用,不完整类型和多态性的具体问题的答案。
我希望我能解释这个问题没有张贴很多代码,但如果我失败了,请让我知道,我会尝试写下一个简单的例子。
我有两个类,它们都相互使用(比如类COne和CTwo)。而且,类COne有一个基类(比如BaseOne)。
我使用头守卫(如果你叫它们的话)和不完整类型来"解决"循环依赖问题。
:
#pragma once
和c++文件顶部的某个地方,用于CTwo:
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
定义可用的位置,或者在源文件中COne
定义可用的位置编写自己的转换函数BaseOne *to_base(COne *)
并实现。
相关文章:
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 类中的字符串不命名类型
- 不完整类型错误(E0409、E0070、E0515)
- CRTP 单一实例不完整类型或非文本类型
- 使用具有结构不完整类型错误的模板
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- Xalloc 不命名类型
- (结构名/类名)不命名类型C++
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 为什么我得到变量"Node"不是类型名称错误
- Visual Studio Code "variable " u8 的 C/C++ 扩展名 " " 不是类型名称"
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- C++ 外部类不命名类型
- 有没有办法用不变语法获得当前的类类型?
- 标准容器模板可以用不完整类型实例化吗?
- 什么时候不能用“类”代替“类型名”
- 用Clang编译c++11代码的不完整类型
- 为什么C++不能用 "super class" 类型的右值初始化 "derived class" 类型的变量?