gpt4 book ai didi

c++ - 堆栈对象的动态转换失败

转载 作者:太空狗 更新时间:2023-10-29 20:16:10 27 4
gpt4 key购买 nike

前几天我遇到一个实例,我有一个函数接受一个指向基类型的指针,然后我需要向上转换为派生类型以访问一些附加功能。但是,dynamic_cast 失败了,这很奇怪,因为我的类型肯定继承了基类型。

为了弄清到底发生了什么,我创建了以下测试程序,我认为它复制了我所看到的:

void cast(TestClass *baseType)
{
if (dynamic_cast<Derived *>(baseType))
TRACE("cast was sucessful");
else
TRACE("cast failed");
}

int main(int argc, char *argv[])
{
Derived *test1 = new Derived();
TestClass *test2 = new TestClass();
TestClass test3;

test1->identify(); // prints: this is a Derived class
test2->identify(); // prints: this is a TestClass

cast(test1); // succesful
cast(test2); // fail - expected

// reassign test2 to test1
test2 = test1;
test2->identify(); // prints: this is a Derived class

cast(test2); // succesful

// the interesting part, the test3 object (created on stack), does not cast
// despite that it would seem possible from the cast method.
test3 = *test1;
test3.identify(); // prints: this is a TestClass
cast(&test3); // fails?

return a.exec();
}

这很有趣,因为如果只向您展示我称为 cast() 的方法,您会期望它可以转换传入的对象。我已经证明这是是这样的;这取决于对象最初是如何创建的。令人困惑的是,为什么可以强制转换已通过引用而不是通过值重新分配的对象。此外,只要我们保证类型兼容,使用 static_cast 是否可行?

最佳答案

test3 属于 TestClass 类型(我假设它是 Derived 的父级),因此动态转换失败。

即使您将 *test1 分配给它,分配也只会复制 TestClass 部分(又名 slicing )。当您将指针分配给指针时,不会发生切片。

您可以将派生对象视为具有其基础的一部分:

*test1:
|--------------|
|TestClass part|
|--------------|
|Derived part |
|--------------|

test3:
|--------------|
|TestClass part|
|--------------|

当您分配一个指针 (test2=test1) 时,对象本身并没有改变,您只是通过不同的玻璃杯(通过指向 TestClass 的指针)查看它>), 从而铸就作品。

当您分配一个对象本身 (test3=*test1) 时,目标 (test3) 只为 TestClass 对象分配空间,所以拷贝带走了额外的 Derived 部分。

关于c++ - 堆栈对象的动态转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10365219/

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