【发布时间】:2018-02-07 14:17:19
【问题描述】:
class BASE {
public:
virtual ~BASE() {}
void lamp() {
cout << "\nBASE CLASS";
}
};
class DERIVED : public BASE {
public:
void fun();
};
void DERIVED::fun() {
cout << "\nDERIVED CLASS!";
}
int main() {
BASE * pbase = new DERIVED; //BASE CLASS POINTER
void * vbase = pbase; //VOID POINTER TAKING BASE POINTER
DERIVED * pder; //DERIVED CLASS POINTER
//pder = static_cast<DERIVED *>(vbase); //THIS WORKS
pder = dynamic_cast<DERIVED *>(vbase); //THIS DOESN'T
pder->lamp();
pder->fun();
return 0;
}
每当我尝试将void* 指针动态转换为派生类指针时,都会出现以下错误:
不能将'vbase'('void*'类型)动态转换为'class DERIVED*'类型(源不是指向类的指针)
我搜索了 StackOverflow 并按照建议在基类中实现了一个虚函数以避免错误。我究竟做错了什么? 这可能吗?
我的总体意图是使用 void* 指针将任何传入的 Object 类型转换为 Derived 类类型。我希望你明白我的意思。
例如:
void dynamicCast(void * vptr)
{
BASE * pbase = new DERIVED;
DERIVED * pder;
pder = dynamic_cast<DERIVED *>(vbase);
}
我应该能够将任何类型的指针传递给dynamicCast 函数,并且它应该被转换为派生类指针。
【问题讨论】:
-
你所要求的基本上是不可能的。你为什么要这样做?也许还有另一种方法可以实现。
-
答案是:你不知道。
-
void *指针不能安全地转换为BASE *或DERIVED *,因为它们不相关。您不能将static_cast或dynamic_cast用于此目的。 -
您可以将 void * 存储在列表中,您无需将其转换为任何内容。你需要一个类来存储 void *
-
不,这很容易。您只是无法监视传递给您的数据。不要将 void* 用作节点,它是附加到节点的数据。
标签: c++ void-pointers dynamic-cast