C++函数解析基类指针到派生类指针

C++ function resolving base class pointer to derived class pointer

本文关键字:指针 派生 基类 函数 C++      更新时间:2023-10-16

我尝试在考试题目中使用指针实现类似于JSON的东西,结果我得到了一个我不知道如何解决的错误。

我有这些类(省略实现,因为我认为这对我的错误并不重要(:

struct JSON_BaseObject;
template<typename J_Type>
struct JSON_Value : public JSON_BaseObject;
struct JSON_String : public JSON_Value<std::string>;
struct JSON_Number : public JSON_Value<double>;
struct JSON_Null : public JSON_BaseObject;
using JSON_Children = std::map<std::string, JSON_BaseObject*>;
using JSON_Object = JSON_Value<JSON_Children>;

我想使用JSON_ObjectJSON_BaseObject*类型的子级作为对这些派生类型具有不同重载的函数的参数,因此我创建了这些函数,并希望它们能将JSON_BaseObject*解析为相应的类(指针(:

void print(JSON_Null*, std::ostream& os);
void print(JSON_String* str, std::ostream& os);
void print(JSON_Number* number, std::ostream& os);
void print(JSON_Object* object, std::ostream& os);

当我运行它时,我收到一个运行时错误,程序无法找到函数print(JSON_BaseObject*, std::ostream&),我意识到我并不像我想象的那么擅长 c++。

问题1

是否可以以某种方式从基类解析指针类型参数?

问题2

我怎样才能让它变得不错,例如在不知道obj的派生类的情况下开始使用print(obj, os);

在尝试了访问者模式后,我意识到它解决了我所有的问题。它还以简单的方式解析基指针。

它启用了这样的漂亮代码:

int main()
{
JSON_Object obj = JSON_Object();
JSON_String str = JSON_String("I am a string!");
std::vector<JSON_Base*> basePtrs
{
&obj,
&str
};
Printer printer;
for (auto json : basePtrs)
{
json->PrintMe(printer);
}
}