我眼中的C++继承初探

来源:互联网 发布:印刷图书排版软件 编辑:程序博客网 时间:2024/05/17 01:04

        code0.cpp  热身一下C++, 无继承:

#include <iostream>using namespace std;class A{public:int x;};class B{public:int x;};int main(){cout << sizeof(A) << endl; // 4cout << sizeof(B) << endl; // 4A a;printf("%p\n", &a.x);     // 0013FF7Cprintf("%p\n", &a.A::x);  // 0013FF7CB b;printf("%p\n", &b.x);     // 0013FF78printf("%p\n", &b.B::x);  // 0013FF78return 0;}


      code1.cpp, 简单继承:

#include <iostream>using namespace std;class A{public:int x;};class B : public A{};int main(){cout << sizeof(A) << endl; // 4cout << sizeof(B) << endl; // 4A a;printf("%p\n", &a.x);     // 0013FF7Cprintf("%p\n", &a.A::x);  // 0013FF7CB b;printf("%p\n", &b.x);     // 0013FF78printf("%p\n", &b.B::x);  // 0013FF78printf("%p\n", &b.A::x);  // 0013FF78return 0;}

       code2.cpp继承

#include <iostream>using namespace std;class A{public:int x;};class B : public A{public:int x;};int main(){cout << sizeof(A) << endl; // 4cout << sizeof(B) << endl; // 8A a;printf("%p\n", &a.x);     // 0013FF7Cprintf("%p\n", &a.A::x);  // 0013FF7CB b;printf("%p\n", &b.x);     // 0013FF78printf("%p\n", &b.B::x);  // 0013FF78printf("%p\n", &b.A::x);  // 0013FF74   //可见, B自己有两份xreturn 0;}

      code3.cpp, 将code2.cpp改为无继承等价形式:

#include <iostream>using namespace std;class A{public:int x;};class B{public:int AAAx;int x;};int main(){cout << sizeof(A) << endl; // 4cout << sizeof(B) << endl; // 8A a;printf("%p\n", &a.x);     // 0013FF7Cprintf("%p\n", &a.A::x);  // 0013FF7CB b;printf("%p\n", &b.x);     // 0013FF78printf("%p\n", &b.B::x);  // 0013FF78printf("%p\n", &b.AAAx);  // 0013FF74   //可见, code2.cpp中的成员变量继承的效果实际上类似于直接拷贝代码return 0;}

      code4.cpp, 看看无继承的函数

#include <iostream>using namespace std;class A{public:void test(){}};class B{public:void test(){}};int main(){cout << sizeof(A) << endl; // 1cout << sizeof(B) << endl; // 1A a;printf("%p\n", a.test);     // 00401131printf("%p\n", a.A::test);  // 00401131B b;printf("%p\n", b.test);     // 004010D7printf("%p\n", b.B::test);  // 004010D7return 0;}

    code5.cpp 看看函数继承:

#include <iostream>using namespace std;class A{public:void test(){}};class B : public A{};int main(){cout << sizeof(A) << endl; // 1cout << sizeof(B) << endl; // 1// 居然都是00401131, 要理解A a;printf("%p\n", a.test);     // 0040112Cprintf("%p\n", a.A::test);  // 0040112CB b;printf("%p\n", b.test);     // 0040112Cprintf("%p\n", b.B::test);  // 0040112Cprintf("%p\n", b.A::test);  // 0040112C  return 0;}

code6.cpp函数继承

#include <iostream>using namespace std;class A{public:void test(){}};class B : public A{public:void test(){}};int main(){cout << sizeof(A) << endl; // 1cout << sizeof(B) << endl; // 1A a;printf("%p\n", a.test);     // 00401131printf("%p\n", a.A::test);  // 00401131B b;printf("%p\n", b.test);     // 004010D7printf("%p\n", b.B::test);  // 004010D7printf("%p\n", b.A::test);  // 00401131  //这里居然是00401131, 要理解return 0;}

       

       可见, 在继承中, 成员变量的继承类似于“拷贝”, 成员函数的继承类似于“共用”。

  




0 0