排序对象和多态

时间:2010-03-17 19:36:31

标签: c++ sorting polymorphism

假设我有一个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 []?

3 个答案:

答案 0 :(得分:8)

多态对象由指针或引用(或指针包装器)引用。交换指针就足够了。实际上,您应该能够将std::sortstd::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移到BC。为此,在OOP中使用虚函数。它们作为虚拟表绑定到对象。如果您将B*投放到A*,例如A* a = new B;a vtable new B的方法覆盖。但是,如果您将B投射到A,例如A a = B(),没有方法指针被复制到a vtable

长话短说,你不会将比较责任移到课程BC 而不使用指针(或参考,但那是更难维护)。

答案 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() ) {}
};