本帖最后由 lrj2025kernel 于 2026-8-14 12:56 编辑
[] 纯文本查看 复制代码 #include <iostream>
#include <cstring>
class Object;
// ============================================================
// RuntimeClass
// ============================================================
struct RuntimeClass
{
const char* name;
// 父类的 RuntimeClass
RuntimeClass* base;
// 动态创建函数
Object* (*createObject)();
// 所有 RuntimeClass 组成一个链表
RuntimeClass* next;
// 链表头
static RuntimeClass* first;
// --------------------------------------------------------
// 根据 RuntimeClass 创建对象
// --------------------------------------------------------
Object* CreateObject()
{
if (createObject == nullptr)
{
std::cout << "这个类不支持动态创建\n";
return nullptr;
}
// 调用函数指针
return (*createObject)();
}
// --------------------------------------------------------
// 根据类名查找 RuntimeClass
// --------------------------------------------------------
static RuntimeClass* Load(const char* className)
{
RuntimeClass* current = first;
while (current != nullptr)
{
if (std::strcmp(current->name, className) == 0)
{
return current;
}
current = current->next;
}
return nullptr;
}
};
// RuntimeClass 的静态成员必须在类外定义
RuntimeClass* RuntimeClass::first = nullptr;
// ============================================================
// Object
// ============================================================
class Object
{
public:
virtual ~Object()
{
}
// 返回当前对象真正的 RuntimeClass
virtual RuntimeClass* GetRuntimeClass() const = 0;
// --------------------------------------------------------
// 判断:当前对象是不是 target 类型
// --------------------------------------------------------
bool IsKindOf(RuntimeClass* target)
{
RuntimeClass* current = GetRuntimeClass();
while (current != nullptr)
{
if (current == target)
{
return true;
}
// 沿着继承关系向父类走
current = current->base;
}
return false;
}
virtual void SayHello()
{
std::cout << "Hello Object\n";
}
};
// ============================================================
// View
// ============================================================
class View : public Object
{
public:
static RuntimeClass runtimeClass;
RuntimeClass* GetRuntimeClass() const override
{
return &runtimeClass;
}
void SayHello() override
{
std::cout << "Hello View\n";
}
};
// View 的 RuntimeClass
RuntimeClass View::runtimeClass =
{
"View",
nullptr, // View 没有我们模拟的父类
nullptr, // View 不支持动态创建
nullptr
};
// ============================================================
// MyView
// ============================================================
class MyView : public View
{
public:
static RuntimeClass runtimeClass;
// --------------------------------------------------------
// 动态创建函数
// --------------------------------------------------------
static Object* CreateObject()
{
return new MyView;
}
RuntimeClass* GetRuntimeClass() const override
{
return &runtimeClass;
}
void SayHello() override
{
std::cout << "Hello MyView\n";
}
};
// MyView 的 RuntimeClass
RuntimeClass MyView::runtimeClass =
{
"MyView",
&View::runtimeClass,
&MyView::CreateObject,
nullptr
};
// ============================================================
// 注册 RuntimeClass
// ============================================================
// 把 RuntimeClass 加入链表
void RegisterRuntimeClass(RuntimeClass* runtimeClass)
{
runtimeClass->next = RuntimeClass::first;
RuntimeClass::first = runtimeClass;
}
// ============================================================
// main
// ============================================================
int main()
{
// --------------------------------------------------------
// 1. 注册类
// --------------------------------------------------------
RegisterRuntimeClass(&View::runtimeClass);
RegisterRuntimeClass(&MyView::runtimeClass);
// --------------------------------------------------------
// 2. 测试 IsKindOf
// --------------------------------------------------------
MyView* p = new MyView;
std::cout << std::boolalpha;
std::cout
<< "MyView 是 MyView 吗:"
<< p->IsKindOf(&MyView::runtimeClass)
<< '\n';
std::cout
<< "MyView 是 View 吗:"
<< p->IsKindOf(&View::runtimeClass)
<< '\n';
// --------------------------------------------------------
// 3. 根据类名查找 RuntimeClass
// --------------------------------------------------------
const char* className = "MyView";
RuntimeClass* pClass =
RuntimeClass::Load(className);
if (pClass == nullptr)
{
std::cout << "找不到类:"
<< className
<< '\n';
delete p;
return 0;
}
// --------------------------------------------------------
// 4. 动态创建对象
// --------------------------------------------------------
Object* pObj =
pClass->CreateObject();
if (pObj != nullptr)
{
pObj->SayHello();
}
// --------------------------------------------------------
// 5. 释放对象
// --------------------------------------------------------
delete p;
delete pObj;
getchar();
return 0;
} |