草庐IT

c++ - 如何从纯抽象基类引用创建对象拷贝?

我想编写一个适用于特定层次结构中的任何派生类的函数,而不修改抽象类输入参数:classA{public:A(intval):m_i(val){}virtualvoidadd(inti)=0;intm_i;};classB:publicA{public:B(intval):A(val){}B():A(0){}virtualvoidadd(inti){m_i+=i;}};classC:publicA{public:C(intval):A(val){}C():A(0){}virtualvoidadd(inti){m_i+=i*2;}};intf(constA&base_class){//ho

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

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

c++ - 虚继承中构造函数的调用顺序是怎样的?

c++虚继承中构造函数的调用顺序是怎样的?针对下面两种多重继承的情况;(I)对于下面的代码,没有虚继承;classa{public:a(){cout输出是:ababcabcdef(II)类e虚继承:classa{public:a(){cout输出是:abcabcdeabf谁能解释一下这两种情况下的输出是如何获得的?虚继承如何影响对象的构造? 最佳答案 首先初始化虚基类,否则直接基类按照基类声明从左到右的顺序初始化。对于类f,classf:publicb,publice,没有虚基类,直接基类b会是首先初始化,然后是e。(从左到右的顺序

c++ - 虚拟继承是否增加开销

假设我有这个类:classA{};这个派生类:classB:publicvirtualA{};然后没有任何东西从B派生。声明Bvirtual是否会增加不需要的开销? 最佳答案 我认为虚拟继承可能需要少量的额外开销,尽管这可能取决于编译器如何实现非虚拟继承。普通继承可以通过简单地将派生类的成员连接到基类来实现(类似于将基类作为派生类的第一个成员)。访问基类的成员是从对象开头的简单偏移量,就像访问派生类的成员一样。但是对于虚拟继承,必须通过指针进行间接寻址。这允许所有从同一个基类虚拟继承的类都有指向基类共享数据的指针。因此访问基类的成员

c++ - 使用 protected 非虚拟析构函数时抑制 delete-non-virtual-dtor 警告

我有一个纯抽象接口(interface)类和一个实现该接口(interface)的派生类。structFoo{virtualvoiddoStuff()=0;};structBar:Foo{voiddoStuff()override{}};我的接口(interface)类没有虚拟析构函数。因此,尝试使用基类指针破坏派生实例显然是未定义的行为intmain(){Foo*f=newBar;f->doStuff();deletef;}幸运的是我的编译器足够聪明,可以捕捉到这个(使用-Werror)main.cc:15:9:error:deletingobjectofabstractclasst

c++ - 如何在 C++ 中针对克隆习惯创建 spy 类

来自Java/PHP世界,我对C++还是个新手。一些用其他语言做的简单事情用C++做起来有点棘手。我的主要问题如下。现在,我有一个类(即“Something”),构造函数为其注入(inject)了虚拟类依赖项(即“Base”的子级)。然后,构造函数将这个注入(inject)的实例存储在unique_ptr中。类字段(使用克隆成语)。这在应用程序级别运行良好,一切似乎都按预期运行。这是示例代码:classBase{public:virtualstd::unique_ptrclone()=0;virtualvoidsayHello()const=0;};classSomething{pub

C++:覆盖已弃用的虚拟方法时的弃用警告

我有一个纯虚类,它有一个应该是const的纯虚方法,但不幸的是不是。该接口(interface)在一个库中,该类由单独项目中的几个其他类继承。我试图在不破坏兼容性的情况下(至少在一段时间内)使此方法成为const,但我找不到在非const方法重载时产生警告的方法。以下是到目前为止我能够生成的示例:第0阶段:变革之前。只有Interface::doSomething()方法的非常量版本存在,并且它是纯虚拟的。第1阶段:过渡期间。Interface::doSomething()方法的const和非const版本都存在。它们都有一个默认实现,以允许旧样式和新样式实现(在这个阶段它们不能是纯虚

c++ - 在 Visual Studio 2008 监 window 口中调试 C++ 虚拟多重继承

我在调试VisualStudioC++2008中的项目时遇到问题,该项目包含指向具有虚拟多重继承的对象的指针。如果指针是基类型,我将无法检查派生类中的字段。我做的一个简单的测试用例:classA{public:A(){a=3;};virtual~A(){}inta;};classB:virtualpublicA{public:B(){b=6;}intb;};classC:virtualpublicA{public:C(){c=9;}intc;};classD:virtualpublicB,virtualpublicC{public:D(){d=12;}intd;};intmain(in

c++ - 未使用的私有(private)虚拟方法是否允许在不破坏 ABI 兼容性的情况下进行 future 扩展?

我正在开发一个共享库。假设我有以下类定义:classMyClass{public://publicinterfaceprivate:virtualvoidfoo1(int);virtualvoidfoo2(int,bool);virtualvoidfoo3(double);virtualvoidreserved1();virtualvoidreserved2();virtualvoidreserved3();classImpl;Impl*impl_;};reserved#虚拟方法不会在客户端代码中被覆盖,也不会从任何地方调用。它们充当future扩展的占位符。假设我将其中一个保留方法替

c++ - 如何通过 AST 为访问者模式解决 C++ 中的 header 重复问题

请注意:这些是描述一般困境的代码片段。完整的代码确实包括“includeguards”/#pragmaonce/whathaveyou。我正在实现遍历AST的访问者模式,想知道解决以下问题的C++方法是什么:我有AST.h,它有基本的AST节点类声明:classNode{public:virtualvoidaccept(Visitor*v){v->visit(this);}};连同用于声明、表达式等的所有具体节点子类。然后我有ASTVisitor.h声明访问者界面,按照以下行:classVisitor{public:Visitor(){}virtual~Visitor(){}virtu