私はこのコード例を持っています。なぜこのように動作するのか理解したいと思います。これは、イントロのC++コースでの過去の試験論文の質問です。私は今、試験のために勉強しており、クラスの継承についての私の理解を固めようとしています。C++での継承とポインタ
#include <iostream>
using namespace std;
class Bird {
public:
virtual void noise() { cout << "mumble" << endl; }
void move() { noise(); cout << "fly" << endl; }
};
class Canary: public Bird {
public:
void noise() { cout << "chirp" << endl; }
void move() { noise(); cout << "flap" << endl; }
};
class Tweety: public Canary {
public:
void noise() { cout << "tweet" << endl; }
void move() { noise(); cout << "run" << endl; }
};
int main() {
Canary *yellow = new Tweety();
yellow->noise();
yellow->move();
return 0;
}
私はこのコードを実行した、出力は次のとおりです。
つぶやき つぶやき、それはノイズ()のトゥイーティー実装を呼び出している意味 フラップ
、それが呼び出していますCanary move()の実装。私はそれについて混乱している。私は多態性の考え方を理解しており、noise()は仮想的なものなので、*は黄色がTweetyへのポインタなので、Tweetyバージョンを呼び出すのが理にかなっています。しかし、それはなぜCanary版のmove()を呼びますか?
Canary *yellow = new Tweety();
これは*黄色はトゥイーティーのオブジェクトを指すポインタカナリア、であることを言う:
は、私は私を混乱させているもの、ラインだと思います。私は基本クラスのポインタが派生クラスを指すことができるので、私はそれで大丈夫です。しかし、黄色はTweetyを指すので、なぜTweetyの移動を使用しないのですか?
ご協力いただきありがとうございます。
この例には多重継承はありません。この動作を理解しないようにするには、仮想メンバ関数と非仮想メンバ関数の違いを理解する必要があります。 –
あなたは 'Canary'ポインタに' move'を呼び出し、 'Canary'には' move'は仮想ではありません。 – keith
私は鳥が "不調"であるのを知らなかった –