多態易誤題4

3317 ワード

次のコードを見て、結果を出力します.
#include
#include
using namespace std;

class Canimal
{
protected:
    string mname;
public:
    Canimal(string name):mname(name){}
    virtual void bark()  =0;
};

class dog:public Canimal
{
public:
    dog(string name):Canimal(name){};
    void bark()
    {
        cout<":"<<"wang wang awng "<public Canimal
{
public:
    cat(string name):Canimal(name){}
    void bark()
    {
        cout<":"<<"miao miao miao "<int main()
{
    Canimal *s1 = new dog("dog"); 
    Canimal *s2 = new cat("cat"); 
///////////////////////////////
    int *p11 =(int*)s1;
    int*p22 = (int*)s2;
    int tep = *p11;
    *p11 =* p22;
    *p22= tep;
/////////////////////////

    s1->bark();
    s2->bark();
    return 0;
}

dog:miao miao miao cat:wang wang awng任意のキーを押して続行してください...
main()の交換コードのセット、すなわち////////////////////が含まれている部分がなければ、出力結果は正常で、dog:wang wang cat:miao miao miao、加えて交換すると、変わります.なぜなら、交換されるのはクラスオブジェクトの最初の4バイトであり、最初の4バイトはvfptr(虚関数テーブルポインタ)を格納しているので、dogのbark()クエリを呼び出したのはcatの虚関数テーブルであり、catのbark()を呼び出す.catを呼び出すbarkは、dog虚関数テーブルをクエリーし、dogのbarkを呼び出すと結果:dog:miao miao miao cat:wang wang awng