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

如何在C++中实现类似Java/Kotlin的匿名类实例?

你的C++实现不可行,问题及正确实现方式如下

首先,你写的代码存在几个关键问题:

  • 基类MyClass中的virtual void run();既不是纯虚函数(未加=0),也没有提供函数定义,编译会直接报错。
  • 数组MyClass actions[10]存储的是MyClass对象,但new MyClass()返回的是指针类型,二者类型不匹配;而且如果MyClass是包含纯虚函数的抽象类,根本无法直接实例化对象。
  • C++中每个匿名类都是独立的唯一类型,无法直接存储在要求元素类型统一的数组中,必须借助多态(基类指针/引用)来实现类似Java/Kotlin的逻辑。

正确的实现步骤

1. 定义抽象基类

先把基类改成包含纯虚函数的抽象类,同时必须添加虚析构函数(避免多态场景下的内存泄漏):

class MyInterface {
public:
    // 纯虚函数,使类成为抽象类,只能被继承实现
    virtual void run() = 0;
    // 虚析构函数,确保子类析构被正确调用
    virtual ~MyInterface() = default;
};

2. 使用指针数组存储匿名子类实例

因为要利用多态,我们需要存储基类指针,而不是直接存储对象。这里提供两种常用实现方式:

方式一:原始指针(需手动管理内存)

// 定义指针数组,存储MyInterface的子类指针
MyInterface* actions[2] = {
    // 创建匿名子类实例,继承自MyInterface并实现run
    new class : public MyInterface {
        void run() override { // override关键字确保函数签名与基类匹配
            // 执行第一个自定义操作
        }
    },
    new class : public MyInterface {
        void run() override {
            // 执行第二个自定义操作
        }
    }
};

// 使用示例
for (auto action : actions) {
    action->run();
}

// 记得手动释放内存,避免内存泄漏
for (auto action : actions) {
    delete action;
}

方式二:智能指针(推荐,自动管理内存)

C++11及以后推荐使用std::unique_ptr来避免手动管理内存的繁琐和风险:

#include <memory>
#include <array>

// 用std::array存储std::unique_ptr<MyInterface>
std::array<std::unique_ptr<MyInterface>, 2> actions = {
    std::make_unique<class : public MyInterface>() {
        void run() override {
            // 执行第一个自定义操作
        }
    },
    std::make_unique<class : public MyInterface>() {
        void run() override {
            // 执行第二个自定义操作
        }
    }
};

// 使用示例
for (const auto& action : actions) {
    action->run();
}

// 无需手动释放内存,智能指针会在生命周期结束时自动处理

关键说明

  • override关键字是必要的:确保你重写的是基类的虚函数,避免因函数签名拼写错误导致的隐藏问题。
  • 匿名类的语法:C++中需要用class : public 基类的形式定义匿名子类,然后直接实例化。
  • 多态的核心:通过基类指针指向子类实例,实现同一接口下不同行为的存储和调用,这和Java/Kotlin中匿名实现接口的逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:52:44