从父对象C ++访问子方法

时间:2019-08-12 16:28:23

标签: c++ overriding

我目前正在做一个项目,并学习有关c ++的继承。 但是我遇到了一个我不知道如何解决的问题。

我将给出一个示例代码,因为真正的代码是西班牙语,因此很难理解。

在musicsymbol.h中:

class MusicalSymbol {
public:
    MusicalSymbol();
    virtual ~MusicalSymbol();

    virtual qreal getX();
private:
    ...
};

musicalsymbol.cpp

MusicalSymbol::MusicalSymbol() {}
MusicalSymbol::~MusicalSymbol() {}

qreal MusicalSymbol::getX() {
    return -1;
}

现在我有一个孩子班:

note.h

class Note : public MusicalSymbol{
public:
    Note();
    ~Note();
    qreal getX() override;
private:
    qreal x;

note.cpp

Note::Note() {}
Note::~Note() {}

qreal Note::getX() {
    return this->x;
}

现在我有另一个班级,我有一个MusicalNote载体

std::vector < MusicalSymbol > tab_score;

我使用push_back()向该向量附加属于类注释(和其他子类)的元素,但是稍后当我尝试访问此类的元素时:

tab_score[i].getX();

当我想从Note类获得x时,我总是得到-1作为输出。获得正确价值的最佳方法是什么。 还可以在父类内部创建一个x值并从子类中对其进行修改吗?

编辑:感谢您提供有关切片的信息,现在我知道为什么它不起作用,但仍然不知道如何解决。

感谢大家,让我知道是否有不清楚的地方。

1 个答案:

答案 0 :(得分:3)

问题是您正在存储MusicalSymbol个对象。如果要使用多态性,可以创建一个MusicalSymbol *指针的向量。

然后您进行tab_score[i]->getX()

如果保留MusicalSymbol对象的向量,则每次尝试向该向量添加子对象时,您真正要做的是创建一个父对象,该子对象从子对象中复制其成员,从而丢失子对象专有的成员。 那么tab_score[i]不是子对象而是父对象,因此,当您调用tab_score[i].getX()时,您是在调用父类版本。