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

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

我尝试用指针实现类似于 JSON 的东西作为考试问题的一部分,但我最终遇到了一个我不知道如何解决的错误。

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

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* 到相应的 class (指针):

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

是否可以像这样从基class解析指针类型参数?

问题 2

我怎样才能让它变得更好,例如开始能够在不知道 obj?

的派生 class 的情况下使用 print(obj, os);

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

它启用了这样一个不错的代码:

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);
    }
}