gpt4 book ai didi

c++ - 为什么不能将指向派生类的指针传递给期望引用指向基类的指针的函数?

转载 作者:IT老高 更新时间:2023-10-28 23:03:17 24 4
gpt4 key购买 nike

很抱歉标题太长,但我确实想具体一点。我希望下面的代码可以工作,但它没有,我不知道为什么:/

#include <cstdio>
#include <cassert>

class UniquePointer
{
public:
void Dispose()
{
delete this;
}

friend void SafeDispose(UniquePointer*& p)
{
if (p != NULL)
{
p->Dispose();
p = NULL;
}
}
protected:
UniquePointer() { }
UniquePointer(const UniquePointer&) { }
virtual ~UniquePointer() { }
};

class Building : public UniquePointer
{
public:
Building()
: mType(0)
{}
void SetBuildingType(int type) { mType = type; }
int GetBuildingType() const { return mType; }
protected:
virtual ~Building() { }
int mType;
};

void Foo()
{
Building* b = new Building();
b->SetBuildingType(5);
int a = b->GetBuildingType();
SafeDispose(b); // error C2664: 'SafeDispose' : cannot convert parameter 1 from 'Building *' to 'UniquePointer *&'
b->Dispose();
}

int main(int argc, char* argv[])
{
Foo();
return 0;
}

最佳答案

想象一下它是合法的。然后你可以写这样的代码:

class Animal : public UniquePointer
{
};

void Transmogrify(UniquePointer*& p)
{
p = new Animal();
}

void Foo()
{
Building* b = nullptr;
Transmogrify(b);
b->SetBuildingType(0); // crash
}

请注意,您违反了类型系统(您将 Animal 放在了应有 Building 的位置)而无需强制转换或引发编译器错误。

关于c++ - 为什么不能将指向派生类的指针传递给期望引用指向基类的指针的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7186341/

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