(在msvc2017上测试)
struct AAA
{
virtual float run(int arg)
{
return 5.5f;
}
};
struct BBB : AAA
{
virtual bool run(double arg)
{
return false;
}
};
struct CCC : BBB
{
virtual float run(int arg)
{
return 7.7f;
}
virtual bool run(double arg)
{
return true;
}
};
CCC c;
BBB* pb = &c;
pb->run(5); // call CCC::run(double arg), WHY??
pb->run((int)5); // call CCC::run(double arg), WHY??
为什么 pb->run(5) 只调用 CCC::run(double arg) 而不是 CCC::run(int arg) ?
具有不同签名的子类的虚方法是否与基类的接口(interface)重叠?
最佳答案
一切都很简单。
BBB 类实际上有两个虚函数。一个在其基类 AAA 中声明
struct AAA
{
virtual float run(int arg)
{
return 5.5f;
}
};
其他在类 BBB 本身中声明。
struct BBB : AAA
{
virtual bool run(double arg)
{
return false;
}
};
类 BBB 中声明的函数隐藏了类 AAA 中声明的函数。 (在派生类中声明的任何名称都隐藏了在派生类的基类中声明的同名实体)
在 CCC 类中,这两个函数都被覆盖了。
这些函数调用
pb->run(5); // call CCC::run(double arg), WHY??
pb->run((int)5); // call CCC::run(double arg), WHY??
没有区别,因为它们的参数类型为 int。
指针pb的静态类型是BBB *。因此编译器在类 BBB 中搜索名称 run。
在类中只有一个同名的函数是可见的。是类中声明的函数
virtual bool run(double arg)
{
return false;
}
因此,编译器使用此签名运行此虚函数,但使用为类 CCC 定义的虚函数指针表调用它,因为指针 pb 的动态类型是 CCC *.
您可以通过 using 声明使类 AAA 中声明的函数在类 BBB 中可见。例如
struct BBB : AAA
{
using AAA:: run;
virtual bool run(double arg)
{
return false;
}
};
在这种情况下,函数的声明(在 AAA 类中声明)也是 BBB 类中的成员声明。也就是说 BBB 类将有两个重载的不同虚函数的声明。
这是一个演示程序
#include <iostream>
struct AAA
{
virtual float run(int arg)
{
return 5.5f;
}
};
struct BBB : AAA
{
using AAA:: run;
virtual bool run(double arg)
{
return false;
}
};
struct CCC : BBB
{
virtual float run(int arg)
{
return 7.7f;
}
virtual bool run(double arg)
{
return true;
}
};
int main()
{
CCC c;
BBB* pb = &c;
std::cout << pb->run(5) << '\n';
std::cout << pb->run(5.6 ) << '\n';
return 0;
}
它的输出是
7.7
1
为了使派生类及其基类中的成员声明的情况更清楚,请考虑 block 作用域的类似情况。
这是一个演示程序
#include <iostream>
void f( int ) { std::cout << "void f( int )\n"; }
void f( double ) { std::cout << "void f( double )\n"; }
int main()
{
void f( double );
f( 5 );
f( 5.5 );
return 0;
}
函数 main block 范围内的函数 f 的内部声明隐藏了函数在全局范围内的其他声明。
程序输出为
void f( double )
void f( double )
关于c++ - 调用虚函数的逻辑不清晰(或者是方法隐藏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57577757/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re