从派生 class 中的强制转换泛型指针访问成员会导致访问冲突
Accessing member from casted generic pointer in derived class causes Access Violation
所以我有一个名为 "TestScript" 的 class,它派生自基数 class "Script"。 "Script" 有一个名为 parent 的成员,它是一个通用指针。
在 "TestScript" 中,我有一个名为 "parentObj" 的 "GameObject" 类型的成员。
所以我想做的是将通用指针从 "Script" 基 class 转换为 "parentObj" 成员并访问它的 "GameObject" 成员,但这会导致访问冲突。
我已经单步执行了代码并确认我访问 "GameObject" 类型的 "name" 成员的行是发生错误的地方。
代码如下:
"Script" class 定义(在 "Objects.cpp" 中):
class Script
{
public:
void* parent = NULL; // The generic pointer
virtual void Initialize() {} // Not used
virtual void Update() {}
virtual void OnDestruction() {} // Also not used
};
"TestScript" class 定义:
#include "Objects.cpp"
class TestScript : public Script
{
public:
GameObject *parentObj = static_cast<GameObject*>(parent); // Casting...
TestScript() {}
void Update() override
{
std::cout << parentObj->name << std::endl; // Access violation here.
}
};
"GameObject"类型也在"Objects.cpp"
中定义
使用 this 关键字从其他地方已声明的 "GameObject" 自动将通用指针设置为 "GameObject"。
可能是你在代码GameObject *parentObj = static_cast<GameObject*>(parent)
后面设置了"parent"值;被执行(如果我没记错的话,它是在基础构造函数之后和派生的 class ctor 之前执行的)
考虑使用函数:
GameObject* GetparentObj ()
{
return static_cast<GameObject*>(parent);
}
所以我有一个名为 "TestScript" 的 class,它派生自基数 class "Script"。 "Script" 有一个名为 parent 的成员,它是一个通用指针。 在 "TestScript" 中,我有一个名为 "parentObj" 的 "GameObject" 类型的成员。
所以我想做的是将通用指针从 "Script" 基 class 转换为 "parentObj" 成员并访问它的 "GameObject" 成员,但这会导致访问冲突。
我已经单步执行了代码并确认我访问 "GameObject" 类型的 "name" 成员的行是发生错误的地方。
代码如下:
"Script" class 定义(在 "Objects.cpp" 中):
class Script
{
public:
void* parent = NULL; // The generic pointer
virtual void Initialize() {} // Not used
virtual void Update() {}
virtual void OnDestruction() {} // Also not used
};
"TestScript" class 定义:
#include "Objects.cpp"
class TestScript : public Script
{
public:
GameObject *parentObj = static_cast<GameObject*>(parent); // Casting...
TestScript() {}
void Update() override
{
std::cout << parentObj->name << std::endl; // Access violation here.
}
};
"GameObject"类型也在"Objects.cpp"
中定义使用 this 关键字从其他地方已声明的 "GameObject" 自动将通用指针设置为 "GameObject"。
可能是你在代码GameObject *parentObj = static_cast<GameObject*>(parent)
后面设置了"parent"值;被执行(如果我没记错的话,它是在基础构造函数之后和派生的 class ctor 之前执行的)
考虑使用函数:
GameObject* GetparentObj ()
{
return static_cast<GameObject*>(parent);
}