您的位置:首页 > 编程语言 > C语言/C++

C++类的实现方式

2015-11-25 00:37 323 查看
假设有一个简单类如下:
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只想子类的虚函数表;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: