C++继承类同名数据成员被隐藏,其实都在内存里,转换后都可以被使用

#include "stdafx.h"

class A {
public:
int i;
A() { i=1; }
};

class B: public A {
public:
int i;
B() { i=2; }
};

class C: public B {
public:
int i;
C() { i=3; }
};


int main(int argc, char* argv[])
{
A a1;    printf(" %d\n", a1.i); 
B a2;    printf(" %d\n", a2.i); 
C a3;    printf(" %d\n", a3.i);

printf(" %d\n", ((B)a2).i);
printf(" %d\n", ((B)a3).i);
printf(" %d\n", ((C)a3).i);

printf(" %d\n", sizeof(a1));
printf(" %d\n", sizeof(a2));
printf(" %d\n", sizeof(a3));

return 0;
}

打印结果:

1
2
3
2
2
3
4
8
12

但是仍可以这样调用:

 

//: HIDE.CPP -- Name hiding during inheritance
class homer {
public:
    int i;
    homer() {i=100; }
    int doh(int) const { return 1; }
    char doh(char) const { return 'd';}
    float doh(float) const { return 1.0; }
};

class bart : public homer {
public:
    int i;
    bart() {i=200; }
    class milhouse {};
    void doh(milhouse) const {}
};

main() {
    bart b;
    b.homer::doh(1); // 调用隐藏函数
    printf("%d %d\n", b.homer::i, b.i); // 调用隐藏属性
    //! b.doh('x'); // Error
    //! b.doh(1.0); // Error
}

 

正确输出:100 200

 

posted @ 2014-04-25 05:38  findumars  Views(482)  Comments(0Edit  收藏  举报