有没有类似于函数重载的方法来重载类

Is there a way to overload classes in a way similar to function overloading?

本文关键字:重载 方法 函数 有没有 类似于      更新时间:2024-09-28

我们可以通过给函数提供不同数量的参数来重载它们。例如,函数someFunc()someFunc(int i)可以做完全不同的事情。

有可能在课堂上达到同样的效果吗?例如,具有一个类名,但如果未调用某个函数,则创建一个类;如果未调用该函数,则生成另一个类。例如,如果我有一个dataStorage类,如果只调用add,我希望内部实现是一个列表,但如果同时调用addpop,我希望它是一个堆。

我正试图在C++中实现这一点,但我很好奇这是否可能。其他语言的例子也会有所帮助。谢谢

对象的类型在定义时必须是完全已知的。类型不能依赖于以后对对象所做的操作。


对于dataStorage示例,可以将dataStorage定义为抽象类。例如:

struct dataStorage {
virtual ~dataStorage() = default;
virtual void add(dataType data) = 0;
// And anything else necessarily common to all implementations.
};

可能存在一个";默认";使用列表的实现。

struct dataList : public dataStorage {
void add(dataType data) override;
// And whatever else is needed.
};

可能还有另一个使用堆的实现。

struct dataHeap : public dataStorage {
void add(dataType data) override;
void pop(); // Maybe return `dataType`, if desired
// And whatever else is needed.
};

只需要添加数据的函数将对dataStorage的引用起作用。需要弹出数据的函数将在引用dataHeap时工作。定义对象时,如果编译器允许,则选择dataList,否则选择dataHeap。(编译器不允许将dataList对象传递给需要dataHeap&的函数。(这与您所要求的类似,只是它确实需要手动干预。从好的方面来说,您可以使用编译器来告诉您要做出哪个决定。

这种方法的一个缺点是,更改可能会变得一团糟。与总是使用堆(一个类,没有继承(相比,存在额外的维护和运行时开销。你应该做一些性能测量,以确保成本是值得的。有时简单是最好的设计,即使不是在所有情况下都是最佳的。