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