[英]How can I best use polymorphism on incomplete types in C++
我一直在寻找stackoverflow和google已有一段时间了,但是我似乎找不到关于循环引用,不完整类型和多态性的具体问题的答案。
希望我能在不发布大量代码的情况下解释这个问题,但是如果失败,请告诉我,我将尝试写下一个简单的示例。
我有2个类,它们都互相使用(比如类COne和CTwo)。 而且,COne类具有基类(例如BaseOne)。
我使用标头保护符(如果您称呼它们)和不完整的类型来“解决”循环依赖问题。
在顶部的头文件中:
#pragma once
在CTwo的C ++文件顶部的某个位置:
class COne;
现在,我遇到一个问题,由于类型不完整,编译器似乎不知道COne是从BaseOne派生的。 因此,在一个具有返回类型BaseOne *的函数中,我想返回一个COne *,这应该是可能的,因为它是一个低调的选择,但是它说它们不是同一类型。 我现在使用C风格的演员表修复了此问题
return (BaseOne*)m_c_one;
我想问的是:是否有比使用C样式转换更好的方法来解决此问题?
C样式COne
是不安全的,因为不能保证COne
对象及其BaseOne
子对象具有相同的内存地址(可以保证COne
是标准布局类(9p7),但通常会阻止多态)。
编译器需要COne
完整才能执行转换(3.2p5),因为COne
可以使用虚拟或多重继承,并且通常因为不需要多态类具有简单的内存布局。
struct COne: BaseZero, BaseOne { ... };
struct COne: virtual BaseOne { ... };
您将不得不将强制转换移动到COne
的源文件中的某个点,或者编写自己的强制转换函数BaseOne *to_base(COne *)
,并在源文件中的某个点处实现COne
的定义可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.