C++ 指针强制转换重载

c++ pointer cast overload

提问人:Shizo 提问时间:12/18/2017 最后编辑:Shizo 更新时间:12/18/2017 访问量:1055

问:

基本问题是有没有人知道 c++ 中的方法?Class 2 是 Class1 的子类,它必须保持这种状态。

Class1* a;
Class2* b = (Class2*)a;

basically allowing you
Class1* a;
Class2* b = a;


// tried this but didn't seem to work
class Class1
{
    operator Class2*() { return (Class2*)this; }
}

如果这是一个迟钝的问题/重复,我真的找不到任何对不起的东西,但我并没有完全理解这个问题。如果someoen有类似的东西,将不胜感激。

编辑:一些额外的信息 Class1 = 基类,例如 Player Class2 = 子类,例如 Weapon

Class1 包含指向具有相同值(如 origin)的 Subclass 的指针

玩家有一个指向武器的指针 基本上我想做的是

GetEntity 返回 Player 类型的指针(但返回值也可以是 Weapon)

基本上,现在我想做的是自动化铸造过程,就像

Player* p = GetEntity(0);
Player* p2 = GetEntity(1);
Weapon wpn = (Weapon*)p2;

//so that you are able to do
Weapon wpn = p2;

// Also that Stuff like that would be possible
void Test(Weapon *wpn);

Player *player = GetEntity(1);
// Yes I know this works Test((Weapon*)player) but I am lazy and that's the goal
Test(player);

没有铸造它。

C++ Casting 重载 Operator-keyword

评论

0赞 StoryTeller - Unslander Monica 12/18/2017
公共继承...
0赞 Shizo 12/18/2017
即使我内置了 Class1 的 Class2,我仍然需要强制转换我试图自动化的指针。
0赞 StoryTeller - Unslander Monica 12/18/2017
不,你继承自...决定你所追求的关系。Class1Class2
0赞 Shizo 12/18/2017
我不能,因为 Class2 需要是 Class1 的子类。我将编辑主要帖子。
0赞 Christophe 12/18/2017
你尝试过的将允许将一个普通对象(又名 *a)转换为指针:这是一个奇怪的转换......我们需要更多地了解类之间的关系,以及为什么不使用static_cast也不使用dynamic_cast

答:

1赞 Angew is no longer proud of SO 12/18/2017 #1

你试图实现的确切事情是无法做到的。原因是该行根本不处理类类型,两者都是内置指针类型。当所有操作数都是内置的非枚举类型时,无法引入操作的自定义行为。Class2* b = a;ab

评论

0赞 Shizo 12/18/2017
编辑了这篇文章,并提供了更多关于到底发生了什么的信息。一般的强制转换确实有效,但它会在没有强制转换的情况下产生编译器错误,这正是我试图以任何方式修复的。
0赞 Angew is no longer proud of SO 12/18/2017
@NOBANPLZGod 你的编辑是无稽之谈。如果是类型,则不能执行,因为这是尝试为类型赋值。无论如何,要点是:您不能在两种指针类型(句点)之间引入转换运算符。WeaponWeapon = p2
0赞 Shizo 12/18/2017
是的,我添加了它忘记声明变量名称两次,这使它看起来是故意的,但事实并非如此。同样,在字符串类转换中,它返回 char* 也有效,因此定义自定义类指针转换的区别应该在哪里。不过,听起来你说得很有道理,所以我会尝试找到更多关于这个话题的信息。
0赞 Angew is no longer proud of SO 12/18/2017
@NOBANPLZGod 定义从 到 的自定义转换时,必须是类或枚举。这就是语言的规则。就你而言,它们都是指针:不行。XYXY
0赞 Shizo 12/18/2017
嗯,听起来很合乎逻辑,我会把它标记为我猜的答案。只是想解决一些烦人的问题,但我想我学到了一些新的东西。