C++对象布局及多态实现的探索
系列文章:http://c.chinaitlab.com/special/dxdtbj/Index.html
(一)前言:http://c.chinaitlab.com/cc/basic/200906/787895.html
普通类对象:http://c.chinaitlab.com/cc/basic/200906/787895_2.html
普通继承类对象:http://c.chinaitlab.com/cc/basic/200906/787895_3.html
(二)虚函数的类的对象:http://c.chinaitlab.com/cc/basic/200906/787896.html
(三)虚函数的类的对象(2):http://c.chinaitlab.com/cc/basic/200906/787897.html
(四)类型动态转换和类型强制转换:http://c.chinaitlab.com/cc/basic/200906/787898.html
(五)普通成员函数的调用:http://c.chinaitlab.com/cc/basic/200906/787899.html
(六)虚函数调用:http://c.chinaitlab.com/cc/basic/200906/787900.html
(七)构造函数中的虚函数调用:http://c.chinaitlab.com/cc/basic/200906/787901.html
(八)普通的虚继承:http://c.chinaitlab.com/cc/basic/200906/787902.html
(九)菱形结构的虚继承:http://c.chinaitlab.com/cc/basic/200906/787903.html
(十)菱形结构的虚继承(2):http://c.chinaitlab.com/cc/basic/200906/787904.html
(十一)菱形结构的虚继承(3):http://c.chinaitlab.com/cc/basic/200906/787905.html
(十二)后记:http://c.chinaitlab.com/cc/basic/200906/787906.html
(十三)代码中定义的类的简单说明:http://c.chinaitlab.com/cc/basic/200906/787907.html
学习(一):普通成员函数,静态成员函数,及静态成员变量皆不会在类的对象中有所表示,成员函数和对象的关联由编译器在编译时处理。编译器会在编译时决议出正确的普通成员函数地址,并将对象的地址以this指针的方式,做为第一个参数传递给普通成员函数,以此来进行关联。静态成员函数类似于全局函数,不和具体的对象关联。静态成员变量也一样。静态成员函数和静态成员变量和普通的全局函数及全局变量不同之处在于它们多了一层名字限定。
普通类对象测试代码:
-
#include <iostream>
-
-
class A
-
{
-
-
};
-
-
class B
-
{
-
public:
-
int x;
-
};
-
-
class C
-
{
-
public:
-
void fun(void) { std::cout << "test" << std::endl; }
-
};
-
-
class D
-
{
-
public:
-
static int v;
-
};
-
-
class E
-
{
-
public:
-
static void fun(void) { std::cout << "test" << std::endl; }
-
};
-
-
void main(void)
-
{
-
std::cout << sizeof(A) << std::endl; // 1
-
std::cout << sizeof(B) << std::endl; // 4
-
std::cout << sizeof(C) << std::endl; // 1: 普通成员函数不在类的对象内存中
-
std::cout << sizeof(D) << std::endl; // 1: 静态成员变量不在类的对象内存中
-
std::cout << sizeof(E) << std::endl; // 1: 静态成员函数不在类的对象内存中
-
-
system("pause");
-
}
-
#include <iostream>
-
-
class A
-
{
-
int x;
-
};
-
-
class B1: public A
-
{
-
-
};
-
-
class B2: private A
-
{
-
-
};
-
-
class C: public A
-
{
-
int y;
-
};
-
-
class D: public C
-
{
-
-
};
-
-
class E
-
{
-
char c;
-
};
-
-
class F: public A, public D
-
{
-
-
};
-
-
void main(void)
-
{
-
std::cout << sizeof(A) << std::endl; // 4
-
std::cout << sizeof(B1) << std::endl; // 4:父类的成员变量悉数被子类继承
-
std::cout << sizeof(B2) << std::endl; // 4:并且与继承方式(公有或私有)无关
-
std::cout << sizeof(C) << std::endl; // 8:关于普通继承,子类的对象布局为父类中的数据成员加上子类中的数据成员
-
std::cout << sizeof(D) << std::endl; // 8:多层继承时顶层类在前
-
std::cout << sizeof(E) << std::endl; // 1
-
std::cout << sizeof(F) << std::endl; // 12:多重继承时则最左父类在前
-
-
system("pause");
-
}