代码1
class Base
{
public:
Base(int data=10):ma(data){
cout<<"Base()"<<endl;
}
void show(){cout<<"Base Show()"<<endl;}
void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=20):Base(data),mb(data){
cout<<"Derive()"<<endl;
}
void show(){cout<<"Derive Show()"<<endl;}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Derive d(20);
Base *pb=&d;
pb->show(); //静态绑定(编译期间绑定)
pb->show(100) //静态绑定(编译期间绑定)
cout<<sizeof(Base)<<endl; // 4 字节
cout<<sizeof(Derive)<<endl; // 8字节
cout<<typeid(pb).name()<<endl; // clas Base *
cout<<typeid(*pb).name()<<endl; // class Base
return 0;
}
代码2
class Base
{
public:
Base(int data=10):ma(data){
cout<<"Base()"<<endl;
}
//虚函数
virtual void show(){cout<<"Base Show()"<<endl;}
//虚函数
virtual void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=20):Base(data),mb(data){
cout<<"Derive()"<<endl;
}
void show(){cout<<"Derive Show()"<<endl;}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Derive d(20);
Base *pb=&d;
pb->show(); //动态绑定(运行期间绑定)
pb->show(100) //动态绑定(运行期间绑定) )
cout<<sizeof(Base)<<endl; // 12 字节
cout<<sizeof(Derive)<<endl; // 16 字节
cout<<typeid(pb).name()<<endl; //
cout<<typeid(*pb).name()<<endl; //
return 0;
}
//在上面的代码中,如果一个类中定义了虚函数,编译器会做什么??
//1:一个类里面定义了虚函数,那么编译阶段,编译器给这个类会产生一个唯一的vftable虚函数表,
// 虚函数表中主要存储的内容就是RTTI和虚函数地址,如下图
//2:当程序运行时,每一张(程序中的可能有很多类都有虚函数,每一个类都会对应一个虚函数表)虚函数表都会加载到内存的.rodata区
// 一个类里面定义了虚函数,那么这个类定义的对象,其运行时,在内存中开始部分,多存储一个vfptr虚函数指针,指向相应
// 类型的虚函数表vftable, 一个类型定义的n个对象,指向同一张表
//3:一个类里面虚函数的个数,不影响对象内存大小(vfptr),影响的是虚函数表的大小
//4:如果派生类中的方法,和基类继承来的某个方法,返回值,函数名,参数列表都相同,而且基类的方法是virtual虚函数
// 那么派生类的这个方法,自动处理成虚函数


在上面代码2中,Base 中void show()和 void show(int)为虚函数, 在Derive中有返回值,函数名,参数列表都
相同的show()方法,这个时候我叫重写(或覆盖 即要返回值,函数名,参数列表 都相同),这个Derive中的void show()方法也会处理成虚函数.所以有
下图 Derive中的show()方法地址替换掉继承来的Base的show()函数地址 ,同时我们也可以看到Base中的void show(int)并没有被覆盖

覆盖:基类和派生类的方法,返回值,函数名以及参数列表都相同,而且基类的方法是虚函数,那么派生类的方法就自动处理成虚函数,他们之前成为覆盖关系.
所以根据上图,我们说 覆盖 其实是指虚函数表中函数地址的覆盖
代码2中的这段代码
Base *pb=&d;
pb->show(); //动态绑定(运行期间绑定)
pb->show(100) //动态绑定(运行期间绑定) )
pb->show() pb是Base类型,所以编译器会去Base中查看void show()函数情况
如果是普通函数,那么静态绑定(编译期绑定),但是发现是 void show()函数是个虚函数就进行动态绑定了
同理 pb->show(100)发现Base中的void show(int )也是个虚函数,所以执行动态绑定(运行期绑定).
但是 这两个函数在Derive虚函数表中的区别就是,void show()被Derive覆盖掉了,即虚函数表中的地址被覆盖了
而void show(int) 为被覆盖,所以虚函数表中的地址仍然是Base的void show(int)的地址
----------------------------------------
cout<<sizeof(Base)<<endl; // 4 +8 =12 字节 Base中又多了一个虚函数表指针
cout<<sizeof(Derive)<<endl; // 8+8 =16 字节 Derive 多了一个虚函数表指针
------------------------------------------------------
cout<<typeid(pb).name()<<endl; // Base *
cout<<typeid(*pb).name()<<endl; //
关于这句代码typeid(*pb).name(),即打印指针指向对象的类型, 先看pb是Base类型,再看有没有虚函数
1:如果没有虚函数,那么*pb 识别的是编译时期的类型,即 Base class
2:如果有虚函数,那么 *pb 识别的是运行时的类型,即RTTI类型,RTTI是存储在虚函数表中,所以要在运行期识别
即 pb->d(vfptr)->Derive vftable -> Class Derive

我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我使用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
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。