C++类的实现方式

假设有一个简单类如下:
class Test{
private:
	int m;
public:
	Test(int i) {
		m = i;
	}
	int getM(){
		return m;
	}
	static void print() {
		cout << "static func" << endl;
	}
};

调用如下:
Test t(1);
a.getM();
Test::print();

C++类实现方式:
struct Test {
	int m;
};

// 构造函数
void Test_initialize(Test* this, int i) {
	this->m =i;
}

// 普通成员函数中默认传递了一个this指针
int Test_getM(Test* this) {
	return this->m;
}

// 静态成员函数中无this指针
void Test_print() {
	cout << "static func" << endl;
}

Test t;
Test_initialize(&t, 1);
Test_getM(&t);
Test_print();

C++多态的实现原理:
当类中声明虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储类成员函数指针的数据结构
虚函数表示由编译器自动生成和维护
virtul成员函数会被编译器放入虚函数表中
存在虚函数时,每个对象中都有一个只想虚函数表的指针(vptr)

class Parent {
public:
	virtual void func() {
	}
	virtual void func(int n) {
	}
};
VTABLE:
void Parent::func();
void Parent::func(int n);

Parent对象:
VPTR = &VTABLE;// 对象初始化完成之后才执行

class Child: public Parent {
public:
	virtual void func() {	
	}
	virtual void func(int n) {
	}
};
VTABLE:
void Child::func();
void Child::func(int n);

Child对象:
VPTR = &VTABLE;// 对象初始化完成之后才执行
 
调用如下:
void run(Parent* p) {
	p->func();
}

编译器确定func是否为虚函数:
是:根据对象的VPTR指针找到VTABLE,调用VTABLE中的func()函数(动态链接);
否:直接调用成员函数(静态编译)。

Child c;
c.VPTR指针分部初始化:
1 当执行父类的构造函数时,c.VPTR指向父类的虚函数表;
2 父类的构造函数执行完成后,c.VPTR只想子类的虚函数表;

你可能感兴趣的:(C/C++)