虚基类/抽象类
抽象类:有纯虚函数的类
代码1
class A{
public:
int ma;
protcted:
int mb;
private:
int mc;
}
//B继承 A,
class B : public A{
public:
int md;
potected:
int me;
private:
int mf;
}


虚继承
通过修饰继承方式, 如代码2是虚继承,被虚继承的类称为虚基类
虚继承派生类的内存布局方式
先是vbptr => 派生类的数据 =>基类的数据 ,
对比代码1和代码2,发现原本基类数据在前面,派生类数据在后面,但是在虚继承的时候
基类数据方式放到了后面,前面放了vbptr和派生类数据.
vbprt指向的是vbtable ,vbtable中存储的数据是偏移量, 是vbptr指针起始位置到基类的偏移量,见代码2和代码2后面的图片
通过偏移量可以找到基类数据,仔细对比代码1和代码2
vfptr/vbptr
vftabe/vbtable
代码2 虚继承
#include <iostream>
using namespace std;
class A{
public:
int ma;
protected:
int mb;
private:
int mc;
};
//B继承 A,
class B : virtual public A{
public:
int md;
protected:
int me;
private:
int mf;
};
int main(){
return 0;
}

代码3
#include <iostream>
using namespace std;
class A{
public:
int ma;
virtual void show()
{
}
protected:
int mb;
private:
int mc;
};
//B继承 A,
class B : public A{
public:
int md;
virtual void show()
{
}
protected:
int me;
private:
int mf;
};
int main(){
A *PA=new B();
PA->show();
return 0;
}

代码4
#include <iostream>
using namespace std;
class A{
public:
int ma;
virtual void show()
{
}
protected:
int mb;
private:
int mc;
};
//B继承 A,
class B : virtual public A{
public:
int md;
virtual void show()
{
}
protected:
int me;
private:
int mf;
};
int main(){
A *PA=new B();
PA->show(); // 能正常调用B的show() 方法
delete PA; // 运行报错! 如下图
return 0;
}
vfptr/vbptr vbtable/vbtable 同时出现
当一个类有虚函数,那么就会生成vfptr,vfptr指向vftable,vftable中主要包含RTTI信息和虚函数地址信息
vbptr 专门为派生类从基类中虚继承用得,vbptr指向vbtable,vbtable中主要存储了vbptr到虚基类地址的偏移量

运行报错原因

PA->show();//正常
delete PA ;//运行报错
A *PA=new B(); 用基类指针指向派生类,问题:new B()返回的地址是vbptr起始地址?还是基类vfptr的起始地址?
基类指针指向派生类对象,PA指向的是基类的起始地址,即上图中vfptr起始地址,PA->show()能正常调用,因为
PA指向vfptr起始地址,直接可以将vfptr读取出来,但是释放内存的时候应该从vbptr地址开始释放,所以报错.
代码5
#include <iostream>
using namespace std;
class A {
public:
int ma;
void operator delete(void *p) {
cout <<"A Operator Delete "<< p << endl;
free(p);
}
virtual void show()
{
}
protected:
int mb;
private:
int mc;
};
//B继承 A,
class B : virtual public A {
public:
int md;
void * operator new(size_t size) {
void * p = malloc(size);
cout << "class B operator new malloc Address=" << p << endl;
return p;
}
virtual void show()
{
}
protected:
int me;
private:
int mf;
};
int main() {
A *PA = new B();
cout << PA << endl;
delete PA;
system("pause");
return 0;
}


结合代码5中申请的内存地址,和返回的地址,类的内存结构,偏移量,等信息进行分析了解
如果代码5中改成如下
int main() {
B b;
A *PA = &b;
system("pause");
return 0;
}
b在栈上申请空间就不会有上面释放内存的错误(windows vc编译环境 ).
另外vfptr 是归属 基类还是派生类问题?
如果基类本身有虚函数的,那么vfptr归属基类,如果基类中没有虚函数,派生类有虚函数,那么vfptr归属派生类 如下图

vbtable中的偏移量是vbptr的起始地址到基类的偏移量
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`
我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5
考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://