过载运算符<在超类中使用纯虚方法

时间:2017-01-05 17:39:51

标签: c++ operator-overloading

我有一个Figure层次结构作为基类和几个子类CircleSquare,ecc。我想在<中重载Figure运算符来对数字进行排序。 Surface在基类中实现。

这是我的代码:

//Figure.hpp
class Figure
{
public:
    virtual float surface() const = 0;
    virtual float perimeter() const = 0;

    friend bool operator<(const Figure& lhs, const Figure& rhs);
    friend bool operator>=(const Figure& lhs, const Figure& rhs);
}

//Figure.cpp
bool operator<(const Figure& lhs, const Figure& rhs)
{
    return lhs.surface() < rhs.surface();
}

bool operator>=(const Figure& lhs, const Figure& rhs)
{
    return lhs.surface() >= rhs.surface();
}

//Square.hpp
class Square : public Figure{
public:
    Square(float size);
    float surface() const{
        return mSize * mSize;
    };
    float perimeter()const{
        return mSize * 4;
    }
private:
    float mSize;
};

问题是我在运行时遇到错误:

libc++abi.dylib: Pure virtual function called!

lhs.surface()

我使用< LinkedList呼叫Template运算符:

template <typename T>
void List<T>::insertNewNode(T& dataIn) 
{
    if(isEmpty()) 
    {
        insertBegin(dataIn);
    }else //otherwise
    {
        if(dataIn < *startPtr->data) 
        {
            insertBegin(dataIn);
        }
        else if(dataIn >= *endPtr->data) /
        {
            insertEnd(dataIn);
        }
        else 
        {
            //...
        }
    }
}

//main.cpp
List<Figure> *list = new List<Figure>();
Figure *square = new Square(46);
list->insertNewNode(*square);

修改 https://github.com/sanandrea/GenericLinkedList

这是可行的还是我做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是Object Slicing和未定义的行为。

您可以通过

插入值
void List<T>::insertNewNode(T& dataIn)

没关系。由于您通过引用传递它,因此将保留多态性。但是,当您稍后致电insertBegininsertEnd以实际创建您通过T传递的节点时:

void List<T>::insertBegin(T dataIn)

由于对象切片,dataIn失去了多态性。在新创建的节点中存储指向参数的指针时,您还有未定义的行为:

ListNode<T> * newPtr = new ListNode<T>(&dataIn); //creates new node

请注意,&dataIn是指向insertBegin参数的指针,而不是指向dataIn中传递的insertNewNode(T& dataIn)的指针。

您的节点中还有对象切片:T ListNode<T>::getData() //returns data stored in node