由STL的Adapter适配器想到C++多态
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了由STL的Adapter适配器想到C++多态,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1588字,纯文字阅读大概需要3分钟。
内容图文
这几天疫情在家闲来无聊,翻开许久没看的STL开始复读起来。
mem_fun_ref这个函数印象很深。
属于function adapter。
最常见的用法:
#include <iostream>
#include <vector>
#include <deque>
#include <iterator>
#include <algorithm>
using namespace std;
class base
{
public:
virtual void dosomething()
{
}
virtual void donextthing()
{
}
};
class Int : public base
{
public:
Int(int i)
: mI(i)
{
}
virtual void dosomething()
{
cout << "i等于" << mI << endl;
}
void print() const
{
cout << "第" << count++ << "个数是" << mI << endl;
}
private:
static int count;
int mI;
};
int Int::count = 0;
void main()
{
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
vector<int> vec(arr,arr+10);
for_each(vec.begin(),vec.end(),mem_fun_ref(&Int::print));
Int* i = new Int(3);
Int j(5);
cout << "j的大小为:"<< sizeof(j) << endl;
printf("address of base::dosomething %x\n", &base::dosomething);
printf("address of derived::dosomething %x\n", &Int::dosomething);
printf("address of derived::donextthing %x\n", &Int::donextthing);
printf("address of derived::print%x\n", &Int::print);
void(__thiscall Int::* f)(void) = &base::dosomething;
(i->*f)();//->*的用法,经由对象指针调用
(j.*f)(); //.*的用法,经由对象调用
}
依次输出容器内的各个对象。
那这到底是怎么实现的呢?
我们给mem_fun_ref传入了函数的地址,这个是Int,派生类的地址。
妈的语言组织能力太差,直接上图,一切尽在不言中
也就是说父类和子类的虚函数的地址是一样的,一个函数占4个字节的内存,并且虚函数都是连续的地址,这样子类就只需要存一个虚函数表和一个便宜就行了,调用的时候才用__thiscall机制,传入this指针,找到其虚函数表,再调用!
parkseyoung 发布了10 篇原创文章 · 获赞 3 · 访问量 5888 私信 关注内容总结
以上是互联网集市为您收集整理的由STL的Adapter适配器想到C++多态全部内容,希望文章能够帮你解决由STL的Adapter适配器想到C++多态所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。