假设有一个简单类如下:
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只想子类的虚函数表;