草庐IT

c++ - 用专门的版本覆盖多个继承的模板函数

好的,先上示例代码;这是我试图传达我正在尝试做的事情的尝试,尽管它无法编译:#includetemplateclassBase{public:virtualvoidmy_callback()=0;};classDerived1:publicBase,publicBase{public:voidmy_callback(){cout(){cout,publicBase{public:voidmy_callback(){cout(){cout*i_p=d;Base*i_f=d;i_p->my_callback();i_f->my_callback();}{Derived2d;Base*i_p

c++ - 是否有可能有一个继承最终函数但创建相同函数(而不是重写)的派生类?

final函数有问题。我想“停止”类中的多态性,但我仍想在派生类中生成相同的函数。像这样:classBase{protected:int_x,_y;public:Base(intx=0,inty=0):_x(x),_y(y){};intx()const{return_x;}inty()const{return_y;}virtualvoidprint()const{cout 最佳答案 我认为这是一个实验性问题,因为实际上当您需要“覆盖最终函数”时您应该重新考虑您在做什么(听起来很矛盾,不是吗?)。但是您可以引入一个“虚拟”参数,即vo

c++ - C++ 中具有多个可访问参数的访问者模式

考虑以下层次结构:classBase{virtualvoidMethod()=0;virtualvoidAccept(Visitor*iVisitor)=0;};classDerived1:publicBase{virtualvoidMethod(){//impl}virtualvoidAccept(Visitor*iVisitor){iVisitor->Visit(this);}};classDerived2:publicBase{virtualvoidMethod(){//impl}virtualvoidAccept(Visitor*iVisitor){iVisitor->Visi

c++ - 为什么在 C++ 中虚拟函数表指针 (vfptr) 不能是静态的?

如果类的所有对象的虚函数表都是相同的,那么为什么指向该表的指针(vfptr)不能是静态的并在所有对象之间共享? 最佳答案 vtable本质上是静态的。但是您需要一个实际位于对象内部的vptr成员来执行虚拟分派(dispatch)和其他RTTI操作。在vptr实现上,此C++代码:classBase{public:virtualvoidf();};classDerived:publicBase{public:virtualvoidf();};可能会像下面这样:classBase{public:Base::Base():m_vptr(&

c++ - 模板类的虚函数是隐式实例化的吗?

考虑以下代码。是否保证Derived::foo()会被实例化吗?foo()是虚函数,由基类的非虚函数调用。#includeclassBase{public:voidbar(){foo();}private:virtualvoidfoo()=0;};templateclassDerived:publicBase{public:Derived(Tt_):t(t_){}private:voidfoo()override{std::coutmake_obj(){returnDerived(7);} 最佳答案 标准部分14.7.1/11说It

C++ 设计 : cast from base to derived class with no extra data members

我编写了很多处理消息协议(protocol)的代码。消息协议(protocol)通常会有一个通用的消息帧,可以从串行端口或套接字反序列化;该帧包含消息类型,消息负载必须根据消息类型进行处理。通常我会编写一组多态类,其中包含访问器方法和一个引用消息框架的构造函数。我突然想到,我可以直接从消息帧派生访问器类,然后从消息帧重新解释_cast到适当的访问器类,而不是根据对消息帧的引用构造访问器类。这使代码更加简洁并节省了一些字节和处理器周期。请参阅下面的(极其人为和浓缩的)示例。显然,对于生产代码,这一切都需要适当封装,转换成为派生类的成员,更好地分离关注点,并添加一些验证。为了把一个简明的例

C++ 保护 : fail to access base's protected member from within derived class

不可否认,这个问题的标题听起来与你的邻居迈克反复问的问题几乎一模一样。我发现很多问题的措辞相同,但没有一个是我的问题。首先,对于这个问题的上下文,我想澄清几点:1,c++访问控制是基于类而不是基于实例。因此,下面的代码是完全有效的。classBase{protected:intb_;public:boolIsEqual(constBase&another)const{returnanother.b_==b_;//accessanotherinstance'sprotectedmember}};2,我完全理解为什么以下代码无效-另一个可以是兄弟实例。classDerived:public

c++ - 传递派生类型列表,以便将它们存储为成员

我有一个类widget.我有一个抽象类base与衍生物derived_a,derived_b等我要widget保存从base派生的任意数量的对象以便以后多态地使用它们。我的第一次尝试是这样的:#include#include#include#includeclasswidget{public:explicitwidget(std::vector>&¶ms):members{std::move(params)}{}private:std::vector>members;};并且会这样调用:std::vector>v;v.push_back(std::move(std::make_

c++ - 在不知道类成员的情况下从基类实例创建派生类实例

这种情况有可能吗?classBase{intsomeBaseMemer;};templateclassDerived:publicT{intsomeNonBaseMemer;Derived(T*baseInstance);};目标:Base*pBase=newBase();pBase->someBaseMemer=123;//SomevaluesetDerived*pDerived=newDerived(pBase);pDerived->someBaseMemer的值应与pBase->someBaseMember相等,与其他基成员相似。 最佳答案

c++ - 基于模板参数在 C++ 中模拟动态调度

为了问题的缘故,这被大大简化了。假设我有一个层次结构:structBase{virtualintprecision()const=0;};templatestructDerived:publicBase{typedefTraits::TypeType;Derived(Typedata):value(data){}virtualintprecision()const{returnPrecision;}Typevalue;};我想要一个带有签名的非模板函数:Base*function(constBase&a,constBase&b);其中函数结果的特定类型与a和b中具有较大Precisio