草庐IT

c++ - 以下会不会引起内存问题?

假设我在DLL实现中有以下内容(例如,它会有一个cpp文件):classBase{protected:Something*some;public:virtualvoidinit(){some=newSomething();}virtual~Base(){deletesome;}};然后在我的exe文件中:classDerived:publicBase{public:virtualvoidinit(){some=newSomethingElse();}};intmain(){Base*blah=newDerived;deleteblah;}如果DLL在与exe不同的运行时运行,这会不会导

c++ - 调用基础运算符而不是派生运算符 - 正常行为?

由于我目前正在使用C++,我遇到了一个问题。代码如下:#includeclassBase{public:virtual~Base(){}virtualBase&operator=(constBase&o){std::cout(b);//Derivedcalleda=d;//Derivedcalledc=d;//Derivedcalledreturn(0);}评论显示了我得到的输出。最后3个结果非常可预测,但我无法理解第一个。如第二个(static_cast)所示,当右操作数是基类时调用Derived::operator=。然而,g++(4.5.3-r2,gentooLinux)成功理解

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