#include<iostream>
using namespace std;
class animal
{
protected:
int age;
public:
virtual void print_age(void) = 0;
};
class dog : public animal
{
public:
dog() {this -> age = 2;}
~dog() { }
virtual void print_age(void)
{
cout<<"Wang, my age = "<<this -> age<<endl;
}
};
class cat: public animal
{
public:
cat() {this -> age = 1;}
~cat() { }
virtual void print_age(void)
{
cout<<"Miao, my age = "<<this -> age<<endl;
}
};
int main(void)
{
cat kitty;
dog jd;
animal * pa;
int * p = (int *)(&kitty);
int * q = (int *)(&jd);
p[0] = q[0];
pa = &kitty;
pa -> print_age();
return 0;
using namespace std;
class animal
{
protected:
int age;
public:
virtual void print_age(void) = 0;
};
class dog : public animal
{
public:
dog() {this -> age = 2;}
~dog() { }
virtual void print_age(void)
{
cout<<"Wang, my age = "<<this -> age<<endl;
}
};
class cat: public animal
{
public:
cat() {this -> age = 1;}
~cat() { }
virtual void print_age(void)
{
cout<<"Miao, my age = "<<this -> age<<endl;
}
};
int main(void)
{
cat kitty;
dog jd;
animal * pa;
int * p = (int *)(&kitty);
int * q = (int *)(&jd);
p[0] = q[0];
pa = &kitty;
pa -> print_age();
return 0;
}
结果为:wang , my age=1
这个程序中主要是多态的一些知识点,虚表及虚函数部分。
在类中我们主要存在两部分,第一部分是虚表,占4个字节,第二部分是变量部分,因为只有age一个变量,所以占4个字节。
主程序中,我们用pa指向基函数,Kitty地址赋给pa,其中q[0]指向虚表中首地址,赋值给cat中的p[0],因此当调用cat时,在执行虚表时,运行的是dog中的虚函数,出现wang, my age=,而this指向仍为cat中的age,所以等号后面出现的是数字1.
虚表 |
变量 |