草庐IT

polymorphism

全部标签

c++ - 有没有办法打破这种对单元测试的依赖?

我的A类依赖于B类。这是代码//declarationclassA{public:A(B*b);~A();voidm1();private:B*ptr_b;};//implementationA::A(B*b){ptr_b=b;}A::~A(){deleteptr_b;}voidA::m1(){ptr_b->m2();}我想用以下解决方案打破这种依赖性(用于单元测试)。这是代码classFakeB:publicB{public:FakeB();~FakeB();virtualvoidm2()=0;};classStubB:publicFakeB{public:StubB();~Stub

c++ - 初始化多态指针容器

我可以初始化多态boost::ptr_vector与boost::assign::list_of?#include#includeboost::ptr_vectorls=boost::assign::list_of(newAnt)(newBee)(newCat);编译失败:error:nomatchforcallto'(boost::assign_detail::generic_list)(Bear*)'替换boost::ptr_vector与std::vector给出相同的错误。两个人建议手动提供模板参数Animal*至list_of:boost::assign::list_of(n

c++ - 如何模拟方法模板的虚拟性

我有一个类层次结构,我想在其中引入一个方法模板,该模板的行为就像它是虚拟的一样。例如一个简单的层次结构:classA{virtual~A(){}templatevoidmethod(T&t){}};classB:publicA{templatevoidmethod(T&t){}};然后我创建对象B:A*a=newB();我知道我可以通过typeid(a)获取存储在a中的类型。当我知道类型时,如何动态调用正确的B::method?我可能会遇到这样的情况:if(typeid(*a)==typeid(B))static_cast(a)->method(params);但我想避免出现这样的情况

c++ - 了解多态设计 (C++)

基于我的动态语言背景,我发现我在使用静态类型语言(例如C++)表达我的意图时遇到了问题。我正在为我的应用程序设计一个偏好系统。由于每个偏好都会有一些关联值(默认值、限制、观察者函数...),我决定将每个偏好封装在它自己的对象中。这是我的初稿:classPreference//purelyabstractclass{parseFromString(Strings)=0;get()=0;voidset(newVal)=0;private://internaldata};现在我需要创建一些派生类,如IntPreference、FloatPreference和StringPreference。

c++ - "True Polymorphism"的例子? (最好使用 Haskell)

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我见过很多“真正的多态性”的部分定义,例如here和here但我在任何地方都找不到两个具体示例的区别的明显示例。我知道重载+运算符是某种形式的多态性,它在Haskell和C++中的实现方式不同。有人可以准确地说明两种语言的例子有什么不同吗?

c++ - 无法从 'DerivedClass *' 转换为 'BaseClass *&'

我尝试了下面的代码,并得到了一个编译错误。classA{};classB:publicA{};voidf(A*&p){}intmain(){B*pB;f(pB);//cannotconvertargument1from'B*'to'A*&'return0;}如何让f(pB)调用f(A*&p)函数? 最佳答案 传递给非const引用的指针变量必须与引用匹配相同的数据类型。该函数需要对A*指针的引用,因此这就是您必须提供的内容。如果您有一个B*指针开始,首先将它分配给一个A*变量(因为B派生自A):B*pB=...;A*pA=pB;f(

c++ - 多态类中的虚析构函数

我知道只要你有一个多态基类,基类就应该定义一个虚析构函数。这样当一个指向派生类对象的基类指针被删除时,会先调用派生类的析构函数。如果我在这里错了,请纠正我。此外,如果基类析构函数是非虚拟的,则删除指向派生对象的基类指针将是未定义的行为。如果我也错了,请纠正我。所以我的问题是:为什么当基类析构函数是非虚函数时,对象不会被正确销毁?我假设这是因为虚函数有某种表格,每当调用虚函数时都会记住和查阅该表格。并且编译器知道当一个对象应该被删除时,它应该首先调用派生的析构函数。我的假设是否正确? 最佳答案 如果在删除对象时变量的静态类型是bas类

c++ - 多层继承中的virtual关键字

我有一个继承链,其中A类公开继承自B类,B类又公开继承自C类。C类的析构函数被标记为“虚拟”。是否有人反对将B类和A类的析构函数标记为虚拟的?或者在这些情况下是否需要支付性能/内存损失? 最佳答案 如果基类析构函数被标记为虚拟的,那么派生类析构函数也是隐式虚拟的,您不需要明确地将其指定为虚拟的。没有性能或内存损失所以在你的例子中,如果C有一个虚拟析构函数B并且A继承了析构函数的“虚拟性” 关于c++-多层继承中的virtual关键字,我们在StackOverflow上找到一个类似的问题:

c++ - 使用模板的继承和转换未按预期工作

我一直在研究模板和继承,但是在对基类执行强制转换时使用带有模板参数的虚函数成员有些奇怪。他们似乎使用“直接继承”工作,但如果我稍后“推迟”继承则不行。一些代码来说明:例子[1]structCastExBase{virtualvoidf(){}};templatestructCastExA:CastExBase{voidf(){std::cout,protectedCastExB{voidf()override{(static_cast(this))->execF();}voidg()override{(static_cast(this))->g();}};测试用例:CastExBase

c++ - 多态实现问题

我写了一个程序,它使用虚函数来实现多态性。我有一个主要的User类,它盲目地调用它认为是通用对象的方法(尽管它们实际上应该是专门的)。这些对象来自覆盖其基类中的纯虚函数的类。以下改编代码应演示我的设置:BaseConfig.h中的泛型类(BaseConfig):classBaseConfig{public:...virtualvoiddisplay()const=0;...}SpecialConfig.h中上述泛型类(SpecialConfig)的专用版本:classSpecialConfig:publicBaseConfig{public:...voiddisplay()const;