我目前正在做一个项目,并学习有关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
值并从子类中对其进行修改吗?
编辑:感谢您提供有关切片的信息,现在我知道为什么它不起作用,但仍然不知道如何解决。
感谢大家,让我知道是否有不清楚的地方。
答案 0 :(得分:3)
问题是您正在存储MusicalSymbol
个对象。如果要使用多态性,可以创建一个MusicalSymbol *
指针的向量。
然后您进行tab_score[i]->getX()
。
如果保留MusicalSymbol
对象的向量,则每次尝试向该向量添加子对象时,您真正要做的是创建一个父对象,该子对象从子对象中复制其成员,从而丢失子对象专有的成员。
那么tab_score[i]
不是子对象而是父对象,因此,当您调用tab_score[i].getX()
时,您是在调用父类版本。