c – 从Derived *转换为Base *&

前端之家收集整理的这篇文章主要介绍了c – 从Derived *转换为Base *&前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图通过将引用传递给指针而不是指向指针的指针来回答 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 *类型的对象不能绑定到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.
}

编辑

我认为由于“转换”和“转换”这两个词的使用松散,引起了一些混乱.

与可以重新分配的对象不同,引用不能被反弹,因此在我们提到转换的引用的上下文中,我们只关心初始化新引用.

引用总是绑定到一个对象,并且从OP的问题很明显,他的目标是获得一个直接绑定到现有对象的引用.仅当用于初始化引用的对象与引用类型引用兼容时,才允许这样做.本质上,这只是在类型相同的情况下,或者对象的类型是从引用的类型派生的,并且引用类型至少与初始化对象一样是cv限定的.特别是,无论指向类型的关系如何,指向不同类型的指针都不是引用兼容的.

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

总之,儿童可以直接绑定到父母和儿童.但是孩子*不能直接绑定到父母*和…父母* const&可以使用Child *初始化,但引用实际上将绑定到从Child *对象复制初始化的临时Parent *对象.

原文链接:https://www.f2er.com/c/111123.html

猜你在找的C&C++相关文章