2014-11-30 2 views
-3

Не могли бы вы помочь мне понять, почему я получаю следующий вывод?Ускорение и полиморфизм в C++

Z

код приведен ниже:

#include <iostream> 
using namespace std; 

class X { 
public: 
    virtual void shout() { cout << "X"; } 
}; 

class Y : public X { 
public: 
    void shout() { cout << "Y"; } 
}; 

class Z : public Y { 
public: 
    void shout() { cout << "Z"; } 
}; 

int main() { 

    Y *yz = new Z(); 

    yz -> shout(); 

    return 0; 
} 
+2

Потому что 'shout' объявлен' virtual'. –

ответ

1

Потому что это то, что вы запрограммировали. Вы объявили shout() виртуальным, что означает, что в случае объекта Z выполняется Z shout(). Это делается также, если вы не повторяете ключевое слово virtual явно. То есть shout() считается виртуальным, даже если вы не повторяете virtual в каждом производном классе (что необязательно).

В любом случае я бы повторил ключевое слово virtual, а также использовал бы override.

+0

Означает ли это, что как только виртуальный упоминается, когда он становится виртуальным в каждом классе? –

+0

Да. В каждом производном классе. – Silicomancer

2

Поскольку shout объявлен как virtual, C++ будет делать dynamic dispatch, когда она вызывается, и использовать Z «s версия метода, поскольку Z - тип объекта.