gpt4 book ai didi

c++ - 关于 void 指针、类和转换

转载 作者:太空狗 更新时间:2023-10-29 21:00:28 26 4
gpt4 key购买 nike

我有大约一两年的 C++ 经验,但我的编码方式与我在 Java 中的编码方式相同(简单的 oop 东西)。现在我有这个我不明白的示例代码。 (它很大,所以我尽量缩短它,我希望你们已经足够清楚了)

//in .h file
typedef void*(*AnimalCreation)();

//in .cpp
void foo(void* p)
{
AnimalCreation ac = (AnimalCreation)p;

Animal* current_animal = reinterpret_cast<Animal*>(ac());
current_animal->init();
}

//somewhere in another class foo is called
Dog* dog = new Dog(); //Dog is a subclass of Animal
foo((void*)&dog)

AnimalCreation 的目的是什么?那和

有什么区别
typedef void(*AnimalCreation)();`//without asterisk after void

foo 内部发生了什么?

如果 foo 接收的预期参数始终是 Animal 的子类,为什么程序员需要像上面那样实现它而不仅仅是 foo(Animal*)?

谢谢。

最佳答案

typedef void(*AnimalCreation)();

这声明“AnimalCreation”用作指向不返回任何值的函数的指针的类型别名,而这

typedef void*(*AnimalCreation)();

声明它用作指向返回 void 指针的函数的指针的类型别名,即指向您不知道其类型的地址。

foo 中,您会收到这样一个“通用地址”,并且您正在C 转换(可能不安全,在运行时检查)它到一个函数指针。这是您自己的风险:您不知道收到的地址指向什么。之后,您将调用该函数并接收到另一个 void 指针,您将其重新解释(危险)为 Animal 对象。然后使用它。

函数指针不能是任何东西的子类,所以我认为该代码中的参数不是 Animal 子类...而是 Animal 类的子类是该函数返回的对象。假设它也是一个多态类,那么您将能够使用虚拟继承规则调用它的方法。如果您打算检查函数调用接收到的指针并且您不确定它是否是 Animal 类的子类,您最好使用 dynamic_cast

旁注:函数指针和 void* 之间的转换在 C++ 中是一种不好的做法,因为您会丢失有值(value)的类型信息。

关于c++ - 关于 void 指针、类和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22095063/

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