多態易誤題4
3317 ワード
次のコードを見て、結果を出力します.
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
#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