草庐IT

c++ - 为什么如果我删除指向基类的指针我会发生内存泄漏?

我有base类和继承base类的类:classbase{};classderived:publicbase{std::stringstr;};我需要使用指向base类的指针来管理一个derived类,但是下面的代码会导致内存泄漏:base*ptr=newderived();deleteptr;我必须转换ptr,还是有更好的选择? 最佳答案 您需要在基类中有一个虚拟析构函数,以便在运行时找到并调用派生类的析构函数。参见thisquestionandanswer了解更多详情。 关于c++-为

c++ - 为什么要使用虚拟基类?

根据我的阅读,当你有一个保存数据的抽象基类时使用虚拟基类,所以类不会被复制,但是,如果你不使用虚拟类,复制类有什么问题?是否应该避免保存数据的抽象基类?下面是一个例子:classStorable{public:Storable(conststring&s);virtualvoidread()=0;virtualvoidwrite()=0;virtual~Storable();protected:stringfile_name;//storeinfilenamedsStorable(constStorable&)=delete;Storable&operator=(constStorab

c++ - 在基类中混合使用虚函数和非虚函数是否是一种糟糕的编程习惯?

我有一个基类Base,我声明了它的几个多态子类。一些基类的函数是纯虚函数,而另一些则由子类直接使用。(这都是C++)例如:classBase{protected:floatmy_float;public:virtualvoidFunction()=0;voidSetFloat(floatvalue){my_float=value}classsubclass:publicBase{voidFunction(){std::cout因此,如您所见,子类将依赖于设置“my_float”的函数的基类,但对于其他函数而言将是多态的。所以我想知道这是否是一种好的做法。如果您有一个抽象基类,您应该使它

c++ - c++1y 是否允许从派生类对基类变量进行类内初始化?

取而代之的是:classbase{protected:base(intvalue):member{value}{}intmember=0;};classderived_1:publicbase{public:derived_1():base{1}{}};classderived_2:publicbase{public:derived_2():base{2}{}};这会很有用:classbase{protected:intmember=0;//Defaultvalue};classderived_1:publicbase{base::member=1;//Insteadofpassing

c++ - 如何正确组合来自基类和派生类的函数以避免警告?

这个问题类似于this,但更复杂。有接口(interface)和类:classB{public:virtualstringgetName(intindex){returnnames.size()names;};templateclassA:publicT{public:stringgetName(void)//warninghere{returnname;};protected:stringname;};intmain(intargc,constchar*argv[]){Atest;}如您所见,我不能在A中使用usingT::getName,因为T可能没有getName()方法。我怎样

c++ - 使用基类而不是基指针来处理派生类

我有一个像这样的基础抽象类;classX{public:virtual~X(){}virtualdoSomething()=0;};然后我用几个类(如Y、Z等)来实现它,每个类都有自己的构造函数、析构函数和doSomething实现。在我的主要职能中,我这样做;intmain(){std::vectorv;X*x1=newY();X*x2=newZ();v.push_back(x1);v.push_back(x2);for(autop:v){p->doSomething()}}这会按预期调用相应的doSomething实现。但我的问题是我使用指向抽象类的指针通过其基类来操纵派生类的层次

c++ - 调用基类构造函数而不命名其类

classMyDerived:publicIncredble>,And,BaseClass,Name>{public:MyDerived();}MyDerived::MyDerived:???(params){}有没有什么方法可以在不写全名和类型定义的情况下调用基本构造函数?原因很明显是为了避免代码重复,并在基类模板参数中的某个细节发生变化时引入多个位置进行更改。第2级:templateclassMyDerived:publicIncredble>,And,BaseClass,Name>{public:MyDerived();}templateMyDerived::MyDerived:

c++ - 是否可以换出 C++ 中的基类?

假设我有一个基类A1和派生类B1和B2。例如(人为的):classA1{public:intfoo(intinput);};classB1:publicA1{public:intbar(intinput){returnfoo(input);}};classB2:publicA1{public:intbar(intinput){returnfoo(foo(input));}};是否可以创建与B1和B2相同但派生自A2而不是A1的类C1和C2,而不必重新定义“B”?即,我只想将“foo”换成C1和C2中的另一个函数,而无需重新定义如下:classA2{public:intnewFoo(in

c++ - 从基类识别派生类

有什么方法可以检查两个实例是否是同一个派生类?像这样的东西:Base*inst1=newA();Base*inst2=newB();Base*inst3=newA();boolb1=(inst1->class==inst2->class);//class==inst3->class);//显然我可以只向基类添加一个虚函数并实现每个派生类以返回一个唯一值。但是,我宁愿不必为派生类实现任何特定的东西,因为我正在制作一个基于派生自这个基类的API。 最佳答案 typeid(*inst1)==typeid(*inst2)假设Base至少有一

c++ - 在模板虚类层次结构中调用基类方法

假设我有以下类层次结构:templateclassTestBase{public:virtualTconst&do_foo()=0;};templateclassTestDerived:publicvirtualTestBase{public:virtualintdo_bar(){returndo_foo()+1;}};GCC吐出以下内容:error:therearenoargumentsto‘do_foo’thatdependonatemplateparameter,soadeclarationof‘do_foo’mustbeavailable[-fpermissive]note:(