0
点赞
收藏
分享

微信扫一扫

C++ 多态实现原理简析

这是一篇关于讲解关于多态实现原理的问题。

1.关于多态

c++中支持静多态和动多态,静态多态就是常见的函数重载,属于编译时期就决定的多态,动态多态就是本文中叙述的多态,只有在运行时才可以确认运行哪段代码。

2.构成动多态的条件

-\ [1] 存在继承关系
-\ [2] 基类中声明有虚函数且子类可以覆写
````c++
#include <iostream>

using namespace std;
class Base {
public:
explicit Base() {

}
void function() {
    cout << "empty function" << endl;
}
virtual void v1Function()
{
    cout << "virtual 1 function Base" << endl;
}
virtual void v2Function() {
    cout << "virtual 2 function Base" << endl;
}

public:
int data;
};

class Derive :public Base {
public:
explicit Derive() {

}
~Derive() {

}
void v1Function() override
{
    cout << "virtual 1 function Derive" << endl;
}
void v2Function() override
{
    cout << "virtual 2 function Derive" << endl;
}

};

int main() {

Base b;
//int cSize = sizeof(Base);
//cout << "当Base类中只含有data数据时,Base占用的字节数是" << cSize << endl;  //占用4字节,int大小
//cSize = sizeof(Base);
//cout << "当Base类中只含有data数据和一个成员函数时,Base占用的字节数是" << cSize << endl;  //占用4字节,int大小
cSize = sizeof(Base);
cout << "当Base类中只含有data数据和一个成员函数加虚函数时,Base占用的字节数是" << cSize << endl;  //占用8字节,int大小和一个指针

//当类中增加一个虚函数时,编译器会为该类生成一个虚函数表,虚函数表中存放的是类中的虚成员函数地址,虚函数表为所有类对象所共享

//虚函数表存在哪里?虚函数表存在进程的只读数据段。

//int bSize = sizeof(b);
//cout << "当类中无虚函数时,类对象的大小为" << bSize << endl;
bSize = sizeof(b);
cout << "当类中有虚函数时,类对象的大小为" << bSize << endl;

//当类中增加一个虚函数时,类对象中会增加一个虚函数表指针(vPtr),vPtr位于类对象中,指向类的虚表

Base* bPtr = new Derive;

bPtr->v1Function();
//在父类指针或引用调用自己的一个成员函数时,如果该成员函数是虚函数,则在运行时,会根据父类指针所指向的对象的真正类型来决定是
//调用父类的成员函数还是子类的成员函数。

Derive* translate = dynamic_cast<Derive*>(bPtr);

if (translate != nullptr) {
    cout << "类型转换成功" << endl;
    translate->v1Function();
    translate->v2Function();
}
else {
    cout << "类型转换失败" << endl;
}

system("pause");
return 0;

}


> \- [1] **类的虚函数表存放在只读存储区,不是在类内**
> \- [2] **类的虚函数表指针总是和对象绑定,一个对象内含一个虚函数表指针**
> \- [3] **存在父类指针或引用指向子类对象,当父类调用自己的一个成员函数时,如果该成员函数是虚函数,则在运行时,会根据父类指针实际指向的对象的类型来决定是调用父类成员函数还是子类成员函数**
举报

相关推荐

0 条评论