草庐IT

C++:混入和多态性

全部标签

C++ 多态加载/保存

我正在保存一堆不同的对象并将它们重新加载到一个文件中,这些对象都是从一个公共(public)基础派生的,显然我需要存储类名(或类似的东西)以便在重新加载时创建正确的对象类型。保存很容易:classBase{virtualstringclassName()const=0;voidsaveToFile(){write(className());...otherwritingstuff}}classDerived1:publicBase{stringclassName()const{return"Derived1";};...}classDerived2:publicBase{stringc

c++ - 用于多态调用的 x86-64 汇编器

我有C++代码:intmain(){M*m;O*o=newIO();H*h=newH("A");if(__rdtsc()%5==0){m=newY(o,h);}else{m=newZ(o,h);}m->my_virtual();return1;}虚拟调用由这个asm表示:movrax,qwordptr[x]movrax,qwordptr[rax]movrcx,qwordptr[x]callqwordptr[rax]这比我预期的vtable方法调用多了一行。所有四个ASM行都特定于多态调用吗?上面四行怎么伪读?这是完整的ASM和C++(虚拟调用在最后进行):intmain(){addby

c++ - 将多态类数据写入文件?

所以我有这些类(class)。有一个基类,但它有/将会有很多很多派生类,而这些派生类也将能够有派生类。我希望能够拥有一个将二进制数据写入文件的函数,但我不确定如何对大量派生类执行此操作。我在想一些事情:voidwriteData(ofstream&_fstream){_fstream.write()//etc..}但是每个实现此方法的派生类都必须写入其父类的所有数据,这将重复大量代码。在不重写所有以前编写的writeData()代码的情况下,最好的方法是什么? 最佳答案 您可以从派生类实现中调用基类实现:voidDerived::w

c++ - 多态性和数据隐藏 : Does a base class override or ignore a derived class' access restrictions?

请看下面的代码list:#includeusingnamespacestd;classBase{public:virtualvoidMessage()=0;};classIntermediate:publicBase{};classFinal:publicIntermediate{voidMessage(){coutMessage();*///Works:Intermediate*finalPtr=&final;//orBase*finalPtr=&final;finalPtr->Message();return0;}注意以下事项:在抽象Base类中,纯虚函数message()是pub

C++ 静态而非动态多态性

我正在尝试构建一个通用算法。到目前为止,我已经使用类层次结构和指针实现了这一点,如下例所示:structBase{virtualdoublefn(doublex){return0;}};classDerived:publicBase{doubleA;public:Derived(doublea):A(a){}doublefn(doublex){returnA*x;}};//Someotherimplementationsclassalgo{doubleT;std::unique_ptrb_ptr;public:algo(doublet,std::unique_ptr&_ptr);//m

c++ - 静态多态性 : How to define the interface?

下面是我理解的静态多态性的一个非常简单的例子。我不使用动态多态性的原因是我不想阻碍op中PROCESSOR函数的内联。templatevoidop(PROCESSOR*proc){proc->doSomething(5);proc->doSomethingElse();}intmain(){ProcessorYpy;op(&py);return0;}这个例子的问题是:没有明确定义PROCESSOR必须定义什么函数。如果缺少一个,你只会得到一个编译错误。我认为这是不好的风格。它还有一个非常实际的缺点:IDE的在线帮助当然不能向您显示该对象上可用的功能。定义PROCESSOR的公共(pub

c++ - 具有 lambda 的多态访问者

我想在不实现类的情况下使用lambda实现多态访问者。我已经有了一定的基础,但正在为我的lambda表达式的参数进行类型推导而苦苦挣扎。假设我有一些遗留代码库,它决定像这样对多态类型使用类型标签:enumclassClassType{BaseType=0,TypeA,TypeB};classBaseType{public:virtual~BaseType(){}ClassTypegetType()const{returntype;}protected:ClassTypetype;};classTypeA:publicBaseType{public:staticconstClassTyp

c++ - 静态多态性对实现接口(interface)有意义吗?

祝大家圣诞快乐!我正在学习静态多态性,并且正在阅读AndreiAlexandrescu关于基于策略的设计的优秀书籍。我在我的代码中遇到了以下情况:我有接口(interface)Interface指定方法Foo必须存在。该接口(interface)将由Impl类实现。我有以下两个选择:1)动态多态classInterface{public:virtualvoidFoo()=0;}classImpl:publicInterface{public:voidFoo(){};}2)静态多态classImpl{{public:voidFoo(){};}templateclassInterface:

c++ - 对每个元组元素应用多态函数的结果类型

我正在尝试为元组编写转换函数,但是我发现的所有示例要么将函数应用于通过引用传递的元组元素,要么使用非一元函数。但是我想有类似的东西std::tuplet(3.f,2);//returnsstd::tuple:autor1=transform(t,[](autov){returnv>decltype(v)(2);});//returnsstd::tuple:autor2=transform(t,[](autov){returnv+decltype(v)(1);});我得到的关于这个的问题是:是否可以确定将一元函数应用于每个元组元素的结果类型? 最佳答案

c++ - 如何从非多态虚基类向下转型?

有没有办法在不涉及虚函数的情况下从虚基类向下转型为派生类?下面是一些代码来演示我在说什么:structBase1{intdata;};structBase2{charodd_size[9];};structViBase{doublevalue;};structMostDerived:Base1,Base2,virtualViBase{boolok;};voidfoo(ViBase&v){MostDerived&md=somehow_cast(v);//butHOW?md.ok=true;}intmain(){MostDerivedmd;foo(md);}请注意,该代码仅用于演示。我的真