假设我有一个A类。
B和C是A的孩子。
A类有一个用于排序A类数组的通用算法,因此我可以将它用于B和C,而无需再为每个数组再写算法。
在算法中,有时我必须交换。 问题是我只能看到对象是A类,如果我这样做:
A aux = array[i]
array[i] = array[j]
array[j] = aux
我想我有问题。因为array [i],也许它是B类,而aux是A类,所以我想我失去了信息。
我确定你理解这种情况......如何使用父方法算法对通用对象数组进行排序?
编辑:初始数组是静态的。
Edit2:所以它不可能有: A :: sort(数组[]); 做我想做的事情,不能交换。
唯一的方法是拥有一系列参考文献? A * array []?
答案 0 :(得分:8)
多态对象由指针或引用(或指针包装器)引用。交换指针就足够了。实际上,您应该能够将std::sort
或std::stable_sort
与合适的谓词一起使用:
// 'A' defines 'float getSortKey()'
bool mypred(B* first, B* second) {
return first->getSortKey() < second->getSortKey();
}
std::vector<B*> them;
std::sort(them.begin,them.end(),mypred);
此策略可避免对象切片。
答案 1 :(得分:0)
@ritmbo,只要您不熟悉多态性机制,就需要解释@ Alexander的答案。
为什么必须将std::vector<A>
更改为std::vector<A*>
?
您希望拥有基类对象的集合,因此为了对它们进行排序,您需要将对象比较的责任从类A
移到B
和C
。为此,在OOP中使用虚函数。它们作为虚拟表绑定到对象。如果您将B*
投放到A*
,例如A* a = new B;
,a
的 vtable 被new B
的方法覆盖。但是,如果您将B
投射到A
,例如A a = B()
,没有方法指针被复制到a
的 vtable 。
长话短说,你不会将比较责任移到课程B
和C
而不使用指针(或参考,但那是更难维护)。
答案 2 :(得分:0)
我有个主意。如果要按值存储,则“多态”标记会产生误导。在A
使用的A::sort
类对象中简单地覆盖键值怎么样?
struct A
{
int key;
A(int _key) : key(_key) {}
static sort(A array[]); // uses 'key'
};
struct B : public A
{
B() : A( generate_B_key() ) {}
};
struct C : public A
{
C() : A( generate_C_key() ) {}
};