如何在c++中最好地使用不完整类型上的多态性

How can I best use polymorphism on incomplete types in C++

本文关键字:用不完 类型 多态性 c++      更新时间:2023-10-16

我已经在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 *)并实现。