You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中传递类(而非对象)作为参数?

在C++中模拟Delphi的类引用(class of)

Delphi里的TDemo = class of baseclass是类引用类型,用来表示派生自baseclass的类本身,可用于创建实例、调用类方法。C++没有原生的类引用语法,需要通过以下几种方式模拟:

1. 传递类的类型标识(仅用于类型识别)

如果只需要判断类的类型,可使用std::type_info和std::type_index:

#include <typeinfo>
#include <typeindex>

class BaseClass {};
class DerivedClass : public BaseClass {};

void ProcessClassType(const std::type_index& type) {
    if (type == std::type_index(typeid(BaseClass))) {
        // 处理BaseClass类型
    } else if (type == std::type_index(typeid(DerivedClass))) {
        // 处理DerivedClass类型
    }
}

// 调用示例
ProcessClassType(std::type_index(typeid(DerivedClass)));

2. 通过工厂函数传递类(支持创建实例)

这是最贴近Delphi类引用用途的方式,定义工厂函数指针来代表类,用于创建实例:

class BaseClass {
public:
    virtual ~BaseClass() = default;
    // 定义工厂函数类型:返回BaseClass指针
    using ClassFactory = BaseClass* (*)();
};

class DerivedClass : public BaseClass {
public:
    // 派生类的工厂函数
    static BaseClass* CreateInstance() {
        return new DerivedClass();
    }
};

// 接收工厂函数的函数
void CreateAndUse(BaseClass::ClassFactory factory) {
    BaseClass* obj = factory();
    // 使用对象...
    delete obj;
}

// 调用示例
CreateAndUse(DerivedClass::CreateInstance);

3. 用CRTP模板统一实现类引用

通过奇异递归模板模式(CRTP),给所有派生类自动添加类引用能力:

class BaseClass {
public:
    virtual ~BaseClass() = default;
    // 纯虚函数,用于创建实例
    virtual BaseClass* Create() const = 0;
};

// CRTP模板,为派生类提供Create实现
template<typename Derived>
class ClassRef : public BaseClass {
public:
    BaseClass* Create() const override {
        return new Derived();
    }
};

// 派生类继承ClassRef
class DerivedClass : public ClassRef<DerivedClass> {
    // 派生类自定义内容
};

// 接收类引用对象的函数
void UseClass(const BaseClass* classRef) {
    BaseClass* obj = classRef->Create();
    // 使用对象...
    delete obj;
}

// 调用示例
UseClass(new ClassRef<DerivedClass>());

4. 用std::function简化工厂传递

C++11及以上可用std::function包装工厂逻辑,更灵活:

#include <functional>

class BaseClass {
public:
    virtual ~BaseClass() = default;
};

class DerivedClass : public BaseClass {};

void Process(std::function<BaseClass*()> factory) {
    BaseClass* obj = factory();
    delete obj;
}

// 调用示例
Process([]() { return new DerivedClass(); });

内容的提问来源于stack exchange,提问作者Para

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:25:23