码迷,mamicode.com
首页 > 编程语言 > 详细

c++类继承-小记

时间:2015-06-20 16:58:34      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

class A{
public:
    A(){print1();} //在构造函数里面调用virtual函数的做法本身不对,这里只为测试

    virtual void print1(){
        std::cout << "A print1" << std::endl;
    }
};

class B : public A{
public:
    virtual void print1(){
        std::cout << "B print1" << std::endl;
    }
};

class C{
public:
    char ch;
    virtual void print2(){
        std::cout <<"C print2"<<std::endl;
    }
};

class D : public A, public C
{
public:
    int cd;
    virtual void print1(){
        std::cout << "D print1" << std::endl;
    }

    virtual void print2(){
        std::cout << "D print2" << std::endl;
    }
};


int main()
{
    //Q1
    B b; // 输出 A print1

    //Q2
    std::cout << sizeof(D) <<std::endl; //16
    return 0;
}

/*
//A1:
输出A print1的原因是在class A的构造方法里面,对象b的构造方法内部还没有执行,
所以对象b还没有初始化也就没有虚函数表,在A的构造方法里面this指针就是A类型的,
所以是调用A的print1 //A2 A的内存布局为 ---------- __vfptr = 0x00c0ae48 const A::`vftable‘{for `A‘} ---------- C的内存布局 ---------- __vfptr = 0x00c0abd8 const C::`vftable‘{for `C‘} ch = 0xcccccccc ---------- D的内存布局 --------- A = {__vfptr = 0x00c0ae48 const D::`vftable‘{for `A‘} } B = {__vfptr = 0x00c0abd8 const D::`vftable‘{for `C‘} ch = 0xcccccccc } cd = 0xcccccccc ---------

所以 sizeof(D) = 4 + 8 + 4 (C的大小为8是因为内存还要对其)
*/

 

c++类继承-小记

标签:

原文地址:http://www.cnblogs.com/elang/p/4590731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!