我有一个Figure
层次结构作为基类和几个子类Circle
,Square
,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
这是可行的还是我做错了什么?
答案 0 :(得分:3)
问题是Object Slicing和未定义的行为。
您可以通过
插入值void List<T>::insertNewNode(T& dataIn)
没关系。由于您通过引用传递它,因此将保留多态性。但是,当您稍后致电insertBegin
或insertEnd
以实际创建您通过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
。