草庐IT

polymorphism

全部标签

c++ - c++中许多模板的替代方案

我正在使用gcc5.4.02开发一个c++11应用程序。在这个应用程序中,我有以下模板:templateclassOperator{T3*op1(T1*operand1,T2*operand2);T3*op2(T1*operand1,T2*operand2);T3*op3(T1*operand1,T2*operand2);T3*op4(T1*operand1,T2*operand2);//...T3*opn(T1*operand1,T2*operand2);};在op1、op2、...opn中,我需要用数组做一堆事情(预计可能有数亿个元素)。像算术、比较、复制等。我选择使用模板是因为我

c++ - boost::serialization Archive::register_type 如何工作?

boost::serialization能够序列化它们最派生类的多态对象,即使这些对象由指向基类的引用/指针指向。这不需要虚函数。要做到这一点,boost::serialization需要知道存在的多态类型:Archive::register_type必须在Archive用于序列化的对象。Thisexample展示了如何注册类型以及如何序列化它们。我想知道这是如何实现的。我试图查看boost::serialization源代码但失败了:我不太擅长模板元编程。 最佳答案 boost.serialization可以使用typeid()或

c++ - 智能指针作为多态性的类成员

我是智能指针的新手,如果有人可以提示我作为类成员处理智能指针的方式是否正确,我将不胜感激。更准确地说,我想要实现的解决方案是在类多态性的上下文中,理想情况下应该是异常安全的。给定一个containerofheterogeneuousobjects(std::vector>my_vector),通常添加元素的方式是:my_vector.push_back(shared_ptr(newCChild(1))),以便稍后可以通过以下方式调用特定派生类的成员函数:my_vector[0]->doSomething().我想要实现的是将堆栈对象添加到vector并且仍然能够进行多态性。直觉上……喜

c++ - 关于纯抽象类中的静态成员函数 - 设计模式?

我最近发现了一个在纯抽象类中使用静态成员函数来初始化指向其派生类对象的指针的例子。我想知道,这是一种设计模式还是一种良好的编程习惯?下面的代码只是一个例子(例如defineRectangle()和defineCircle()成员函数):classShape;typedefstd::unique_ptrshape_ptr;classShape{public:Shape(){};virtual~Shape(){};virtualvoiddraw()const=0;virtualfloatarea()const=0;virtualshape_ptrclone()const=0;virtual

c++ - 奇怪的重复模板模式多态拷贝中的继承 (C++)

我正在使用CRTP为继承的类添加克隆方法,例如:classBase{virtual~Base(){};virtualBase*clone()const=0;};templateclassBaseCopyable:Base{public:virtualBase*clone()const{returnnewDerived(static_cast(*this));}};classA:publicBaseCopyable;classB:publicBaseCopyable;etc...但是如果我有一个继承自B的类,例如:classdifferentB:publicB;然后clone()不返回d

c++ - 作为模板参数的函数的多态签名(使用 lambda)

我努力尝试了几个小时,但没能成功。我有一个模板类自旋锁:templateclassspinlock{//...volatileT*shared_memory;};我正在尝试创建这样的东西://insidespinlockclasstemplatestd::result_of(F(Args...))exec(Ffun,Args&&...args){//locksthememoryandthenexecutesfun(args...)};但我正在尝试使用多态函数,这样我就可以做到这一点:spinlockspin;inta=spin.exec([](){return10;});intb=sp

c++ - 在子类中将非纯虚函数变为纯虚函数

所以,我有这个多态层次结构:ClassAIsnotabstract,nopurevirtualfunctions,butafewvirtualfunctionsClassB:publicClassADefinesanextendedinterfaceforacertaintypeofsubclass;isabstractwithpurevirtualfunctionsClassC:publicClassBUsableclass,nomoresubclassing这就是交易,我将把ClassA和ClassC的对象一起放入容器中并进行迭代。为了执行此迭代,ClassA中存在一个非纯虚函数,

C++:多态容器/迭代器与编译时概念/特征

背景这纯粹是为了教育目的。如果您不想阅读整个背景,可以跳到底部的问题。我已经编写了一个Queue接口(interface)(抽象类),以及2个基于调整大小的数组和链表的派生实现。templateclassIQueue{public:virtualvoidenqueue(Titem)=0;virtualTdequeue()=0;virtualboolisEmpty()=0;virtualintsize()=0;}templateclassLinkedListQueue:publicIQueue{...}templateclassResizingArrayQueue:publicIQueu

c++ - 如何从父类转换为子类的接口(interface)

假设我有一个父类Parent和子类Child1和Child2,后者实现了MyInterface:classParent{public:Parent();virtual~Parent();virtualvoidMyMethod();}classMyInterface{public:virtual~MyInterface(){}virtualvoidMyInterfaceMethod()=0;}classChild1:publicParent{public:Child1();virtual~Child1();}classChild2:publicParent,MyInterface{pub

c++ - `shared_ptr` 是如何实现协变的?

可以复制或构建shared_ptr来自shared_ptr(即shared_ptrptr=make_shared())。但众所周知,模板类不能相互转换,即使模板参数可以。那么如何才能shared_ptr检查它们的指针的值是否可转换,如果是则进行转换? 最佳答案 是的,默认情况下同一类模板的特化几乎没有关系,基本上被视为不相关的类型。但是您始终可以通过定义转换构造函数(To::To(constFrom&))和/或转换函数(From::operatorTo()const)来定义类类型之间的隐式转换。那又如何std::shared_ptr