c – 通过对基类的引用来调用虚函数

当我运行它时,此代码拒绝将适当的消息打印到控制台.使用指针而不是引用似乎可行( – >而不是.).我是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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...