多态易错题4

来源:互联网 发布:python爬虫怎么入门 编辑:程序博客网 时间:2024/05/16 01:48

看下面代码,输出结果

#include<iostream>#include<string>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<<mname<<":"<<"wang wang awng "<<endl;    }};class cat:public Canimal{public:    cat(string name):Canimal(name){}    void bark()    {        cout<<mname<<":"<<"miao miao miao "<<endl;    }};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 wang
cat:miao miao miao ,加上交换,就变了。
因为,交换的是类对象的前四个字节,而前四个字节存放的是vfptr(虚函数表指针),于是调用dog的bark()查询的是cat的虚函数表,于是调用的是cat的bark(); 调用cat的bark是,查询的是dog 虚函数表,于是就调用了dog的bark于是结果:
dog:miao miao miao
cat:wang wang awng

0 0