此代码在运行时拒绝将适当的消息打印到控制台。使用指针而不是引用似乎可行( - >而不是。)。我是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
}
答案 0 :(得分:16)
instrument &pi = i;
在此,您pi
引用instrument
对象i
。
pi = p;
您可以在此处将piano
对象p
分配给pi
引用的对象。引用pi
不会反弹到piano
对象。它仍然引用与以前相同的instrument
对象。只是使用隐式生成的默认赋值运算符为其分配了不同的内容。 (在这种情况下,赋值无效,但将派生类型赋值给基类型通常会导致对象切片。)当您调用pi.play()
时,引用仍引用instrument
对象和{ {1}}已执行。
关键是,虽然您可以获得指向不同类型的不同对象的指针,但您不能对引用执行相同操作。它总是指向同一个对象。您可以使用多个引用修复代码:
instrument::play
答案 1 :(得分:0)
使用:
virtual void play() = 0;
代替:
virtual void play(){}
它防止了创建冗余对象的可能性。
答案 2 :(得分:0)
int main ()
{
instrument i,*pi;
piano p;
drum d;
pi= &i;
pi->play(); // -
pi = &p;
pi->play(); // pling
pi = &d;
pi->play(); // dum, dum
}