开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
3 Star 10 Fork 6

secondtonone1/cpplearn

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
cpplearn
/
src
/
virtual_table.cpp
cpplearn
/
src
/
virtual_table.cpp
virtual_table.cpp 3.09 KB
一键复制 编辑 原始数据 按行查看 历史
wangwuchen 提交于 2022年08月02日 11:04 +08:00 . 虚函数表
#include "../inc/vitrual_table.h"
extern void useTable(VirtualTableA *pa);
void destructVirtualTable()
{
VirtualTableA *pa = new VirtualTableB();
useTable(pa);
delete pa;
}
void VirtualTableB::print()
{
cout << "this is virtual table B" << endl;
}
void useTable(VirtualTableA *pa)
{
//实现动态调用
pa->print();
}
/**
1 类的静态函数和构造函数不可以定义为虚函数:
静态函数的目的是通过类名+函数名访问类的static变量,或者通过对象调用staic函数实现对static成员变量的读写,
要求内存中只有一份数据。而虚函数在子类中重写,并且通过多态机制实现动态调用,在内存中需要保存不同的重写版本。
2 构造函数的作用是构造对象,而虚函数的调用是在对象已经构造完成,并且通过调用时动态绑定。
动态绑定是因为每个类对象内部都有一个指针,指向虚函数表的首地址。而且虚函数,类的成员函数,
static成员函数都不是存储在类对象中,而是在内存中只保留一份。
* */
class Baseclass
{
public:
Baseclass() : a(1024) {}
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
int a;
};
// 0 1 2 3(虚函数表空间) 4 5 6 7(用来对齐) 8 9 10 11 12 13 14 15(存储的是a)
class DeriveClass : public Baseclass
{
public:
virtual void f() { cout << "Derive::f" << endl; }
virtual void g2() { cout << "Derive::g2" << endl; }
virtual void h3() { cout << "Derive::h3" << endl; }
};
typedef void (*Func)();
void useVitualTable()
{
Baseclass b;
b.a = 1024;
cout << "sizeof b is " << sizeof(b) << endl;
int *p = (int *)(&b);
cout << "pointer address of vitural table " << p << endl;
cout << "address of b is " << &b << endl;
cout << "address of a is " << p + 2 << endl;
cout << "address of p+1 is " << p +1 << endl;
cout << "value of a is " << *(p + 2) << endl;
cout << "address of vitural table" << (int *)(*p) << endl;
cout << "sizeof int is " << sizeof(int) << endl;
cout << "sizeof p is " << sizeof(p) << " sizeof(int*) is " << sizeof(int *) << endl;
Func pFun = (Func)(*(int *)(*p));
pFun();
pFun = (Func) * ((int *)(*p) + 2);
pFun();
pFun = (Func)(*((int *)(*p) + 4));
pFun();
}
void deriveTable()
{
DeriveClass d;
int *p = (int *)(&d);
int *virtual_tableb = (int *)(*p);
Func pFun = (Func)(*(virtual_tableb));
pFun();
pFun = (Func)(*(virtual_tableb + 2));
pFun();
pFun = (Func)(*(virtual_tableb + 4));
pFun();
pFun = (Func)(*(virtual_tableb + 6));
pFun();
pFun = (Func)(*(virtual_tableb + 8));
pFun();
}
extern void aligneTest()
{
AligneTest::A a;
AligneTest::B b;
AligneTest::C c;
AligneTest::D d;
AligneTest::E e;
cout << "sizeof(a): " << sizeof(a) << endl;
cout << "sizeof(b): " << sizeof(b) << endl;
cout << "sizeof(c): " << sizeof(c) << endl;
cout << "sizeof(d): " << sizeof(d) << endl;
cout << "sizeof(e): " << sizeof(e) << endl;
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

cpp 学习笔记,项目源码
取消

发行版

暂无发行版

贡献者

全部

语言

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/secondtonone1/cpplearn.git
git@gitee.com:secondtonone1/cpplearn.git
secondtonone1
cpplearn
cpplearn
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /