gpt4 book ai didi

c++ - 从 Derived* 转换为 Base*&

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:28 24 4
gpt4 key购买 nike

我试图回答提到的问题 here通过传递对指针的引用而不是像这样指向指针的指针:

class Parent 
{
};

class Child : public Parent
{
};

void RemoveObj(Parent*& pObj)
{
delete pObj;
pObj = NULL;
}

int main()
{
Parent* pPObj = new Parent;
Child* pCObj = new Child;
pPObj = new Parent();
pCObj = new Child();



RemoveObj(pPObj);
RemoveObj(pCObj); // This is line 32
return 1;
}

但这会在第 32 行产生以下编译器错误:

error C2664: 'RemoveObj' : cannot convert parameter 1 from 'Child *' to 'Parent *&'

我同意不允许从 Child** 转换为 Parent**。但是为什么这种转换也不允许呢?

最佳答案

Child* 类型的对象不能绑定(bind)到 Parent*&,原因与不能绑定(bind) Child** 的原因完全相同转换为 Parent**。允许它允许程序员(有意或无意地)在没有转换的情况下破坏类型安全。

class Animal {};

class DangerousShark : public Animal {};

class CuteKitten : public Animal {};

void f(Animal*& animalPtrRef, Animal* anotherAnimalPtr)
{
animalPtrRef = anotherAnimalPtr;
}

void g()
{
DangerousShark myPet;
CuteKitten* harmlessPetPtr;

f(harmlessPetPtr, &myPet); // Fortunately, an illegal function call.
}

编辑

我认为一些混淆是由于“转换”和“转换”这两个词的使用不当造成的。

与可以重新分配的对象不同,引用无法重新绑定(bind),因此在引用的上下文中,当我们谈到转换时,我们只能关心初始化一个新引用。

引用总是绑定(bind)到一个对象,从 OP 的问题可以清楚地看出,他的目标是获得一个直接绑定(bind)到现有对象的引用。仅当用于初始化引用的对象与引用类型引用兼容时才允许这样做。本质上,这仅在类型相同或对象类型派生自引用类型且引用类型至少与初始化对象一样具有 cv 限定的情况下才会发生。特别是,指向不同类型的指针不是引用兼容的,无论指向类型之间的关系如何。

在其他情况下,可以使用可以转换为引用类型的内容来初始化引用。但是,在这些情况下,引用必须是 const 而不是 volatile,转换将创建一个临时对象,引用将绑定(bind)到这个临时对象而不是原始对象。正如所指出的,这不适合OP激励示例的要求。

总而言之,Child 可以直接绑定(bind)到 Parent&Child* 不能直接绑定(bind)到 Parent *&Parent* const& 可以用 Child* 初始化,但引用实际上会绑定(bind)到一个临时的 Parent* 对象,该对象是从Child* 对象。

关于c++ - 从 Derived* 转换为 Base*&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/737108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com