草庐IT

c++ - 代码执行派生类方法,但从基类方法获取默认参数

有人可以解释为什么下面代码的结果是“classB::1”吗?为什么派生类的虚方法使用的是基类的默认参数,而不是他自己的?对我来说这很奇怪。提前致谢!代码:#includeusingnamespacestd;classA{public:virtualvoidfunc(inta=1){coutfunc();return0;} 最佳答案 因为默认参数是根据this的静态类型解析的(即变量本身的类型,如A&中的A&a;)。稍微修改您的示例:#includeclassA{public:virtualvoidfunc(inta=1){std::

c++ - 带接口(interface)的动态转换

我有一个类实现了2个接口(interface)并继承了1个类。所以,通常它看起来像这样:classT:publicA,publicIB,publicIC{};代码中有一处我有IB*,但实际上可以使用A*。我希望动态Actor会喜欢这样:IB*b_ptr=newT;//it'sreallymorecomplicated,butservestheexampleA*a_ptr=dynamic_cast(b_ptr);不幸的是,这不起作用。有没有正确的方法来做到这一点?还是我应该实现变通办法?我考虑过让IB和IC都从A虚拟继承,但是IIRC上次我尝试了一些复杂的事情不受欢迎。有什么想法吗?编辑

C++ - 派生类中的 "Member function not declared"

我在MSVC++2008中遇到问题,其中VS2008抛出此编译错误:errorC2509:'render':memberfunctionnotdeclaredin'PlayerSpriteKasua'现在,令我困惑的是render()已定义,但在继承的类中。类定义是这样的:SpriteBase-InheritedBy->PlayerSpriteBase-InheritedBy->PlayerSpriteKasua因此,SpriteBase.h的简化版本如下:classSpriteBase{public://Variables===============================

c++ - 当 `virtual` 是一个相当大的开销时,是否有任何经验法则?

我的问题基本上完全在标题中陈述,但是让我详细说明。问题:也许值得重新措辞,virtual多么复杂/简单方法必须是,使机制产生相当大的开销?这有什么经验法则吗?例如。如果需要10分钟,使用I/O,复杂if语句、内存操作等,这不是问题。或者,如果您写virtualget_r(){returnsqrt(x*x+y*y);};并在循环中调用它,您会遇到麻烦。我希望这个问题不是太笼统,因为我寻求一些笼统但具体的技术答案。要么很难/不可能说出来,要么虚拟调用占用了太多的时间/周期资源,而数学需要这个,I/O这个。也许一些技术人员知道一些通用数字进行比较或进行一些分析并可以分享一般结论。尴尬的是我不

c++ - 实现接口(interface)类的纯虚方法的方法也应该声明为虚方法吗?

我阅读了关于这个问题的不同意见。假设我有一个带有一堆纯虚方法的接口(interface)类。我在实现接口(interface)的类中实现这些方法,我不希望从实现派生。是否需要将实现中的方法也声明为虚拟的?如果是,为什么? 最佳答案 否-在基类中声明为虚拟的每个函数方法在所有派生类中都将是虚拟的。但是良好的编码实践告诉我们将这些方法声明为虚拟的。 关于c++-实现接口(interface)类的纯虚方法的方法也应该声明为虚方法吗?,我们在StackOverflow上找到一个类似的问题:

c++ - "Missing non-virtual thunks"和继承顺序

我们在C++中有一个大型代码库,在进行了一些小的重构(添加了一个类并重写了一些相关方法)之后,我们开始在GCC3和4上遇到链接器错误。链接器错误特别是“缺少对非虚拟的引用”thunks”在我们的大型SDK中子类化的小示例程序中。除了一些似乎已解决的旧GCC错误外,在网上搜索并没有给出很多提示。问题的属性好像是:GCC3.4.6&4.3.3使用-O2优化多重继承,包括偶尔的虚拟继承。改变继承顺序,比如说,Foo类:公共(public)A,公共(public)B{}到Foo类:公共(public)B,公共(public)A{}在缺少thunk的类上“修复”了问题。虚继承只出现在一个单一的、

c++ - 状态模式 C++

在学习了这里的一些优秀教程之后,我正在尝试创建一个简单的状态模式:http://gameprogrammingpatterns.com/state.html我正在学习当前教程的一半,我正在尝试复制每个状态的静态实例,方法是将它们包含在基类中。但是,在切换状态时,g++会抛出此错误。state_test.cpp:Inmemberfunction‘virtualvoidIntroduction::handleinput(Game&,int)’:state_test.cpp:55:16:error:cannotconvert‘Playing*’to‘GameState*’inassignme

c++ - 删除 C++ 继承中虚拟类成员的代码重复

我现在陷入了一个奇怪的问题。我将编写一个真正简化的版本。classBase{public:virtualintfunc1()=0;virtualintfunc2()=0;protected:intn;};classder1:publicBase{//implementsthevirtualfunctionsofthebaseandusestheprotecteddata//membersofthebase.};classder2:publicBase{//implementsthevirtualfunctionsofthebaseandusestheprotecteddata//mem

c++ - sleep 影响哪个虚拟成员函数被std::thread调用?

我不确定这是否是c++11中的预期行为。这是我发现的一个例子。#include#includeusingnamespacestd;classA{public:virtualvoida()=0;threadt;A():t(&A::a,this){}virtual~A(){t.join();}};classB:publicA{public:virtualvoida(){cout编译运行时$g++-std=c++11-pthreadtest.cpp-otest$./testB::a$但是当sleep被移除时...intmain(){Bb;//this_thread::sleep_for(ch

c++ - 有没有办法在 C++ 基类中创建 "virtual"变量?

我有一个带有指针的基类,需要在所有子类的构造函数中专门对其进行初始化。我怎样才能确保这个变量在子类的构造函数中被初始化?我基本上想要与制作纯虚函数相同的功能,除了指向对象的指针。有办法吗?我的代码看起来像这样:A.hpp:classA{protected:A();X*pointer;};B.hpp:classB:publicA{public:B();};B.cpp:B::B():A(){//howdoimakesurepointergetsinitializedhere?}有什么办法可以实现吗? 最佳答案 改rebase类的构造函数