覆盖const方法不起作用

时间:2014-07-26 13:42:49

标签: c++ visual-studio-2013 override const parent-child

我正在制作一个带有基类“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类中添加覆盖关键字,但它似乎不起作用。

2 个答案:

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