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

时间:2013-04-21 19:46:19

标签: c++ inheritance reference

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

3 个答案:

答案 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 
}