我有一些层次结构:基础,派生类和一些存储用户数据的结构为void*.该void可以存储Base和Derived类指针.我不知道存在什么基本或派生指针的主要问题.
class Base
{
public:
int type;
};
class Derived: public Base
{};
Base* base;//init base pointer
Derived* derived;//init derived pointer
void* base_v = base;
void* derived_v = derived;
//void pointers are correct. They point to base and derived variables.
//try to get type field after converting pointers back
Derived* d_restored = (Derived*)derived_v;//d_restored correct
Base* b_restored = (Base*)base_v;//b_restored correct
Base* d_restored_to_base = (Base*)derived_v;// INCORRECT
如何将void*转换为两个指针的[type]字段?提前致谢.
GMa*_*ckG 19
void*只能转换回原来的类型.当你Derived*在a中存储a 时void*,你只能回转Derived*,而不是 Base*.
这在多重继承时尤其明显,因为派生对象可能不一定与您的基地位于同一地址.如果你真的需要存储东西(和检索东西)void*,总是首先强制转换为基类型,这样你就有了一个稳定的方法来获取对象:
#include <iostream>
struct base { int type; };
struct intruder { int iminyourclassstealingyourbase; };
struct derived : intruder, base {};
int main()
{
derived d; d.type = 5;
void* good = (base*)&d;
void* bad = &d;
base* b1 = (base*)good;
base* b2 = (base*)bad;
std::cout << "good: " << b1->type << "\n";
std::cout << "bad: " << b2->type << "\n";
}
Run Code Online (Sandbox Code Playgroud)
如果您想返回派生类型,请使用a dynamic_cast(或者static_cast如果您保证它必须是派生类型.)
| 归档时间: |
|
| 查看次数: |
6199 次 |
| 最近记录: |