我正在制作一个带有基类“Shape”的几何程序,然后是一堆形状作为派生类,Point,Rectangle,Triangle,Sphere等。 我创建了一个链接的形状列表(目前只有点对象),然后我想通过它们并使用它们的print方法。但是目前调用基类的print方法,而不是派生类。
这是基类的(相关部分)。
//Shape.h
class Shape
{
public:
double x, y;
Shape();
~Shape();
virtual void print() const;
};
然后在基类中实现
//Shape.cpp
#include "Shape.h"
Shape::Shape(){}
void Shape::print() const
{
cout << "Print base class" << endl;
}
现在这里是Point.h和Point.cpp
//Point.h
class Point : public Shape
{
private:
double area;
public:
Point();
Point(double x, double y, double area);
~Point();
double getArea() const;
void print() const;
};
cpp文件
//Point.cpp
#include "Point.h"
Point::Point()
{
x = 0.0;
y = 0.0;
area = 1.0;
}
Point::Point(double xx, double yy, double a)
{
x = xx;
y = yy;
area = a;
}
double Point::getArea() const
{
return area;
}
void Point::print() const
{
cout << "Point print area: " << endl;
}
当我从Point指针调用print方法时,将调用基本方法。
在一个名为ShapeList的类中,我将形状对象添加到列表中,如下所示:
void ShapeList::add(const Shape &s)
{
Node *temp = new Node;
temp->data = &s;//Set myShape to the memory address of s
temp->next = head;//Set the next value of the Node
head = temp;//The head of the current shapelist is now the adress of the new node.
}
然后想要像这样打印出来:
void ShapeList::print() const
{
Node* ptr = head;
while (ptr != NULL)
{
ptr->data->print();
ptr = ptr->next;
}
}
但是调用了基类print方法。有谁知道为什么?我尝试在Point类中添加覆盖关键字,但它似乎不起作用。
答案 0 :(得分:0)
但是调用了基类print方法。有谁知道为什么?
Point类中的打印功能不是虚拟的。
编辑:正如Jarod42指出这不是问题。答案 1 :(得分:0)
对我自己的问题的回答很晚。问题出在“添加”方法中。为了让孩子调用它的函数,我需要将Shape的 copy 添加到列表中。
这是最终正常工作的代码
void ShapeList::add(const Shape &s)
{
//Create the node that will be added to the list
Node* temp;
temp = new Node(s.clone());
//Loop to the end of the list.
Node* ptr;
ptr = new Node();
ptr = head;
if (ptr != NULL)
{
while (ptr->next != NULL)
{
ptr = ptr->next;
}
//At the end, add another Node to the last Node
ptr->next = temp;
}
else
{
head = temp;
}
}
使用新的Clone方法
Shape* Shape::clone() const
{
return new Shape(*this);
}