草庐IT

C++:混入和多态性

全部标签

没有显式指针的 C++ 多态调用

如果我有基类:structBase{voidfoo(){bar();}virtualvoidbar(){}};和派生类:structDerived:publicBase{voidbar(){cerr写这段代码的时候会发生:Derivedd;d.foo();我将看到打印“Derivedhere”——因为调用了Derived::bar。但是我没有通过指向基的指针调用,而是在这里工作的多态性。为什么?是不是因为Base::foo中对bar的调用实际上隐式调用了this->bar()和bar在类的vtable中查找? 最佳答案 您的猜测完全

C++基本多态性

classProduct{...}classPerishable:public:Product{public:intgetday();}intmain(){Product*temp;//duetosomecoding//tempcouldpointtoeitherPerishableobjectorProductobjectthatisdetermine//duringruntimecoutgetday();//isthereotherwaytoachievethistypecastingseemsdangerous此代码的问题在于,如果temp指向Product对象,temp->ge

c++ - C++ 中的多态返回类型

我看过一些关于这个问题的帖子,但没有总结出我目前情况下所有的选择,可能还有我没有考虑过的解决方案。我的情况很一般,我有几个类Inf1Inf2(更像是接口(interface))都有纯虚方法。Inf1有一个方法(Inf2&orInf2*orshared_pointer)foo(/**关于如何构建对象的一些信息**/)=0(这是问题的一部分)。在Inf1的实现中,在实现foo时返回Inf2的各种实现。Inf2实现相对较小,所以我不介意按值返回它们,因此它们是复制构造到结果的,但我不能声明foo只返回Inf2因为那时我会返回一个抽象对象。有什么更好的或有创意的方法来解决这个问题?:)

c++ - 这是非多态继承的一个很好的理由吗?

std::string(因为大多数——如果不是全部——标准类)没有任何虚拟方法,所以创建一个带有虚拟方法的继承类将导致UB(很可能是由于析构函数)。(如果我错了请纠正我)。我认为没有多态性的继承是可以的,直到我在网上看到这个主题。例如,在这个答案中:Whyshouldonenotderivefromc++stdstringclass?一些论点反对这种做法。主要原因似乎是切片问题,当将派生对象传递给函数而不是std::string时,它会抑制添加的功能。参数,从而使非多态性不合逻辑。如果想要扩展string的功能,惯用的C++方法是创建自由函数。.我同意所有这些,特别是因为我提倡自由函数

c++ - 允许运行时和编译时多态性的灵活方式?

示例情况:我正在创建一个用于游戏开发的物理引擎。我有两种空间划分方法:网格四叉树我想允许将要使用我的物理引擎的程序员:在编译时通过模板参数选择空间划分方法Physics::Worldworld;//chosenatcompile-time通过多态对象在运行时选择空间划分方法Physics::WorldRunTimeworld;world.setSpatialPartitioningMethod(newPhysics::Grid);//chosenatrun-time您可以从上面的示例中注意到,我必须使用两个不同的类(World和WorldRunTime)。这会导致代码重复,因为我将拥有

C++:混入和多态性

我正在尝试使Mixin模式适合我的问题,但我有一个多态性问题,我不知道如何有效解决。在尝试重新设计我的程序之前,我想征求您的意见(也许有一些我不知道的很酷的C++功能)。我想以非常直接和简单的方式展示它,所以这里的用例可能没有意义。我只有一个Window类structWindowCreateInfo{std::stringtitle;intx,y;intwidth,height;};classWindow{public:Window(constWindowCreateInfo&createInfo):title(createInfo.title),x(createInfo.x),y(c

c++ - 显示多态类

我有一个带有命令行界面的现有应用程序,我正在向其添加GUI。经常出现的一种情况是,我有一个继承自一个类的对象列表,需要在列表中显示,但每个子类的显示方式略有不同。不想使用反射/RTTI到处都有巨大的switch语句来进行显示,每个类都知道如何返回自己的摘要字符串,然后将其显示在列表中:intposition=0;for(vector::const_iteratoriDisp=listToDisplay.begin();iDisp!=listToDisplay.end();++iDisp)coutGetSummary();相似的功能可以在不同的上下文中显示不同的信息。在我们需要添加GUI

c++ - 一组根据操作数类型而不同名称的函数可以在C语言中称为理论上的静态多态吗?

是否一组函数只做一个词但名称不同,如atoi、atol、atoll等理论上称为多态?例如,我有一个函数swap需要对不同类型的数据进行操作。所以我有一个函数/操作,我有不同的实现,但不幸的是,因为语言不支持使用相同的函数名称,为了获得这样的功能,我需要制作变体swap_i,swap_l、swap_f、swap_str等等,必须根据操作数手动调用它们。在设计代码时,人们会将其设计为一个函数,具有不同的实现,根据操作数调用。但在这种情况下,程序员而不是编译器需要对函数进行静态绑定(bind)。如果程序员用C++实现它,那么设计将是相同的(因为他/她遵循了OOD方法),但在这种情况下,静态绑

C++11 - 编译时多态性解决方案

假设我正在编写一个跨平台库,我必须以不同平台有不同行为的方式组织代码,并且这种行为(或定义)是在编译时根据平台选择的我的图书馆正在编译。在C++中执行此操作的“通常”方法是在编写方法或类时用大量#ifdef污染代码。方法的问题在于:源代码看起来真的很丑如果您支持3个平台,您的源代码大约比您真正需要的大3倍,这意味着您的编译器仍然需要解析和分析所有代码才能“看到”#ifdef不同的实现之间没有真正的区别,当代码库增长时很难维护,而当你只有3-4个平台时,它增长得非常快。由于C++11中有很多新特性,我想知道是否有什么改变,是否有新的选项。 最佳答案

c++ - QVariant 的多态性

我有两个这样的类:classFoo{public:Foo(inti):_i(i){}int_i;};Q_DECLARE_METATYPE(Foo*)classBar:publicFoo{public:Bar(inti,intj):Foo(i),_j(j){}int_j;};Q_DECLARE_METATYPE(Bar*)我的长凳是这样的:intmain(intargc,char*argv[]){QApplicationa(argc,argv);Bar*bar=newBar(10,11);QVariantvar=QVariant::fromValue(bar);Foo*foo=var.v