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

 

#include <iostream>
using namespace std;

class A
{
public:
	int x;
};

class B
{
public:
	int x;
};

int main()
{
	cout << sizeof(A) << endl; // 4
	cout << sizeof(B) << endl; // 4

	A a;
	printf("%p\n", &a.x);     // 0013FF7C
	printf("%p\n", &a.A::x);  // 0013FF7C

	B b;
	printf("%p\n", &b.x);     // 0013FF78
	printf("%p\n", &b.B::x);  // 0013FF78


	return 0;
}

 

      code1.cpp, 简单继承:

 

#include <iostream>
using namespace std;

class A
{
public:
	int x;
};

class B : public A
{
};

int main()
{
	cout << sizeof(A) << endl; // 4
	cout << sizeof(B) << endl; // 4

	A a;
	printf("%p\n", &a.x);     // 0013FF7C
	printf("%p\n", &a.A::x);  // 0013FF7C

	B b;
	printf("%p\n", &b.x);     // 0013FF78
	printf("%p\n", &b.B::x);  // 0013FF78
	printf("%p\n", &b.A::x);  // 0013FF78

	return 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; // 4
	cout << sizeof(B) << endl; // 8

	A a;
	printf("%p\n", &a.x);     // 0013FF7C
	printf("%p\n", &a.A::x);  // 0013FF7C

	B b;
	printf("%p\n", &b.x);     // 0013FF78
	printf("%p\n", &b.B::x);  // 0013FF78
	printf("%p\n", &b.A::x);  // 0013FF74   //可见, B自己有两份x

	return 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; // 4
	cout << sizeof(B) << endl; // 8

	A a;
	printf("%p\n", &a.x);     // 0013FF7C
	printf("%p\n", &a.A::x);  // 0013FF7C

	B b;
	printf("%p\n", &b.x);     // 0013FF78
	printf("%p\n", &b.B::x);  // 0013FF78
	printf("%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; // 1
	cout << sizeof(B) << endl; // 1

	A a;
	printf("%p\n", a.test);     // 00401131
	printf("%p\n", a.A::test);  // 00401131

	B b;
	printf("%p\n", b.test);     // 004010D7
	printf("%p\n", b.B::test);  // 004010D7

	return 0;
}

 

    code5.cpp 看看函数继承:

 

 

#include <iostream>
using namespace std;

class A
{
public:
	void test(){}
};

class B : public A
{
};

int main()
{
	cout << sizeof(A) << endl; // 1
	cout << sizeof(B) << endl; // 1

	A a;
	printf("%p\n", a.test);     // 0040112C
	printf("%p\n", a.A::test);  // 0040112C

	B b;
	printf("%p\n", b.test);     // 0040112C
	printf("%p\n", b.B::test);  // 0040112C
	printf("%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; // 1
	cout << sizeof(B) << endl; // 1

	A a;
	printf("%p\n", a.test);     // 00401131
	printf("%p\n", a.A::test);  // 00401131

	B b;
	printf("%p\n", b.test);     // 004010D7
	printf("%p\n", b.B::test);  // 004010D7
	printf("%p\n", b.A::test);  // 00401131  //这里居然是00401131, 要理解

	return 0;
}

       

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

  

 

 

 

 

本文转载:CSDN博客