有没有类似于函数重载的方法来重载类
Is there a way to overload classes in a way similar to function overloading?
我们可以通过给函数提供不同数量的参数来重载它们。例如,函数someFunc()
和someFunc(int i)
可以做完全不同的事情。
有可能在课堂上达到同样的效果吗?例如,具有一个类名,但如果未调用某个函数,则创建一个类;如果未调用该函数,则生成另一个类。例如,如果我有一个dataStorage
类,如果只调用add
,我希望内部实现是一个列表,但如果同时调用add
和pop
,我希望它是一个堆。
我正试图在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&
的函数。(这与您所要求的类似,只是它确实需要手动干预。从好的方面来说,您可以使用编译器来告诉您要做出哪个决定。
这种方法的一个缺点是,更改可能会变得一团糟。与总是使用堆(一个类,没有继承(相比,存在额外的维护和运行时开销。你应该做一些性能测量,以确保成本是值得的。有时简单是最好的设计,即使不是在所有情况下都是最佳的。
相关文章:
- 重载方法的方式会在使用临时调用时生成编译器错误
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 使用 nullptr 调用重载方法是不明确的
- 具有重载方法的可变参数数据结构
- C++11 重载方法,并转发到唯一方法
- 获取特定的模板重载方法指针
- std::result_of 应用于 const 重载方法
- 重载方法的类接受模板和基类 - 如何默认某个方法
- 推导模板类重载方法的地址会导致"error: expected primary-expression before ‘decltype’"
- C++如何使用按值传递和按引用传递的重载方法
- 具有原始方法参数派生类的 C++ 重载方法参数
- SWIG:在派生类中处理基类重载方法
- 在c++中的赋值运算符重载方法中删除旧的动态分配内存
- C++选择'wrong'默认参数的重载方法
- 重写重载方法会隐藏一些重载
- 在C++中,如何从父类变量的子类调用重载方法
- 所有重载方法的别名
- 使用 SWIG 在重载C++方法中设置类型