当我运行它时,此代码拒绝将适当的消息打印到控制台.使用指针而不是引用似乎可行( – >而不是.).我是OOP的新手,请原谅我,如果你觉得这太荒谬了.
#include <iostream>
using namespace std;
class instrument {
public:
virtual void play(){}
};
class drum : public instrument {
public:
void play(){
cout << "dum,dum" << endl;
}
};
class piano : public instrument {
public:
void play(){
cout << "pling" << endl;
}
};
int main (){
instrument i;
piano p;
drum d;
instrument &pi = i;
pi.play(); // -
pi = p;
pi.play(); // pling
pi = d;
pi.play(); // dum,dum
}
解决方法
instrument &pi = i;
在这里你让pi参考仪器对象i.
pi = p;
在这里,您将钢琴对象p指定给pi引用的对象.参考pi不会反弹到钢琴对象.它仍然指的是与以前相同的仪器对象.只是使用隐式生成的默认赋值运算符为其分配了不同的内容. (在这种情况下,赋值没有效果,但是将派生类型赋值给基类型通常会导致对象切片.)当你调用pi.play()时,引用仍然引用一个乐器对象而乐器:: play是执行.
关键是,虽然您可以获得指向不同类型的不同对象的指针,但您不能对引用执行相同操作.它总是指向同一个对象.您可以使用多个引用来修复代码:
instrument &pi = i; pi.play(); // - instrument &pp = p; pp.play(); // pling instrument &pd = d; pd.play(); // dum,dum