草庐IT

c++ - CRTP 静态多态性 : Using the Base Class to Call Derived Methods

C++中virtual的主要好处之一是能够使用基类(指针或引用)调用派生方法。我正在阅读usingCRTPtoimplementstaticpolymorphism,但我不明白如何使用这种技术实现上面提到的内容,因为当需要模板时,我无法将函数声明为采用Base类型。在我看来,文章中描述的内容可以通过简单地使用函数重载来实现,所以我确信这种技术一定有更多。(PS:在对thisquestion的回答的评论中提到了这个确切的问题,但不幸的是没有人回复它:“vtables真正提供的是使用基类(指针或引用)来调用派生方法。你应该在这里展示它是如何用CRTP完成的。”)这是我的最小代码,它给出了错

c++ - 非多态派生类的基类

我有以下类定义:classBaseHandle{/*Lotsofthings*/};classVertexHandle:publicBaseHandle{/*Onlystaticmembersandnon-virtualfunctions,defaultdtor*/};classEdgeHandle:publicBaseHandle{/*Dito*/};classFaceHandle:publicBaseHandle{/*Dito*/};所有类都没有虚函数或基类。派生类仅派生自BaseHandle,不添加任何非静态成员,也不添加非默认dtor。我想将Vertex-、Edge-和Face

c++ - 确定多态 C++ 类的大小

使用sizeof运算符,我可以确定任何类型的大小——但我如何在运行时动态确定多态类的大小?例如,我有一个指向Animal的指针,我想得到它指向的实际对象的大小,如果它是Cat就会不同或Dog.有没有一种简单的方法可以做到这一点,而不是创建一个虚拟方法Animal::size并重载它以返回sizeof每种特定类型? 最佳答案 如果您知道可能的类型集,则可以使用RTTI通过执行dynamic_cast找出动态类型。如果不这样做,唯一的方法就是通过虚函数。 关于c++-确定多态C++类的大小,

c++ - C++ 中的多态性为什么不起作用?

classBase{public:virtualvoidf();voidf(int);virtual~Base();};classDerived:publicBase{public:voidf();};intmain(){Derived*ptr=newDerived;ptr->f(1);deleteptr;return0;}ptr->f(1);显示以下错误:“函数调用中的参数过多”。为什么这是不可能的?derived不是继承了base的所有功能并且可以自由使用其中的任何功能吗?我可以明确地调用它并且它会起作用,但为什么不允许这样做? 最佳答案

java - 多态性? C++ 与 Java

作为初学者尝试多态性。我想我正在尝试不同语言的相同代码,但结果不一样:C++#includeusingnamespacestd;classA{public:voidwhereami(){coutwhereami();return0;}结果:You'reinAYou'reinBYou'reinAJava:publicclassBextendsA{voidwhereami(){System.out.println("You'reinB");}}//andsameforAwithoutextends//...publicstaticvoidmain(String[]args){Aa=newA

c++ - C++ 中的 vector 和多态性

我有一个棘手的情况。它的简化形式是这样的classInstruction{public:virtualvoidexecute(){}};classAdd:publicInstruction{private:inta;intb;intc;public:Add(intx,inty,intz){a=x;b=y;c=z;}voidexecute(){a=b+c;}};然后在一节课上我做了类似...voidsome_method(){vectorv;Instruction*i=newAdd(1,2,3)v.push_back(*i);}在另一个类(class)...voidsome_other_

c++ - 是否可以将多态类存储在共享内存中?

假设我有类Base和Derived:publicBase。我已经使用boost::interprocess库构建了一个共享内存段。是否有可能有类似这样的代码:Base*b=newDerived();write(b);//oneappwritesBase*b2=read(b);//secondappreads//bequalsb2(bitwise,nottheptrlocation)我在这里看到的问题是,例如Base的派生类所需的空间是未知的(那么要分配多少shmem?)问:如何在应用程序之间通过指针传递对象? 最佳答案 只需阅读其d

c++ - 非多态继承对性能/内存使用有影响吗?

我很好奇继承对非多态类的影响。具体来说,我正在编写两个智能指针类,都没有使用虚方法,而且都用于非常独特的目的。由于基本运算符重载和一些标准函数是相同的,而且它们只需要一个成员变量,所以我想我可以使用一个基类来重用代码。这是我的意思的简单模型:基类:templateclassPointer_Impl{public:T&operator*(){returnthis->*m_pointer;}//etc.protected:T*m_pointer;//protectedtopreventinstantiationwithoutusing=deletePointer_Impl(){}Point

c++ 多态性 ((X*)y)->foo() vs ((X)*y).foo()

假设Y是类X的派生类,并且X声明foo是虚拟的。假设y是类型(Y*)。然后((X*)y)->foo()将执行Y版本的foo(),但((X)*y).foo()将执行X版本。你能告诉我为什么多态性不适用于取消引用的情况吗?我希望这两种语法都能产生Y版本的foo()。 最佳答案 您正在切片Y对象部分并将该对象复制到X对象中。然后调用的函数是在X对象上调用的,因此调用了X的函数。当您在声明或强制转换中指定C++中的类型时,这意味着声明或强制转换为的对象实际上是该类型,而不是派生类型。如果您只想将对象视为X类型(也就是说,如果您希望表达式的静

C++:多态类模板

考虑一个存储一堆Date对象的Calendar类。日历旨在保存从Date继承的任何类型的对象的集合。我认为最好的方法是拥有一个类模板,例如templateclassCalendar{...}但令我震惊的是,D现在实际上可以是任何类。我现在的问题是,如何确保D是日期对象的子类?我知道如何在Java中执行此操作,但我仍然不熟悉C++语法。这个问题与某些集合如何只能采用实现Comparable的模板变量非常相似。然后标题看起来像publicclassCalendar{...}--------------------编辑:------------------------------------