关于虚表与虚函数

 #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;


结果为:wang , my age=1

这个程序中主要是多态的一些知识点,虚表及虚函数部分。

在类中我们主要存在两部分,第一部分是虚表,占4个字节,第二部分是变量部分,因为只有age一个变量,所以占4个字节。

主程序中,我们用pa指向基函数,Kitty地址赋给pa,其中q[0]指向虚表中首地址,赋值给cat中的p[0],因此当调用cat时,在执行虚表时,运行的是dog中的虚函数,出现wang, my age=,而this指向仍为cat中的age,所以等号后面出现的是数字1.

虚表
变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值