草庐IT

c++ - 是否使用非虚析构函数和基类指针释放了整个对象?

如果一个基类没有虚析构函数(例如为了避免vtable条目)并且派生类只有基本属性,它是否释放了new分配的所有内存,当基类的指针被删除?我知道Derived类的析构函数不会被调用,但我想知道整个对象分配的内存是否会被释放?我还假设在Derived指针上调用delete将释放整个内存空间。此外,如果它不释放内存的派生类部分,它如何在相同的情况下工作,但使用基类中的虚拟析构函数,知道要释放多少内存?例子:classBase{public:inta;intb;Base(){}~Base(){}};classDerived:publicBase{public:intc;intd;Derived

c++ - 如何在派生类中重用基类函数

假设我们有这四个类:二叉树,SplayTree(它是BinaryTree的子类),二进制节点和SplayNode(它是BinaryNode的子类)。在BinaryTree类中,我有这两个函数,在SplayTree中,我想重用第一个函数,因为它的工作方式与SplayTree中的相同。//BinaryTree.cppboolFind(constT&data)const{Node*found=Find2(data,root);//...}virtualNode*Find2(constT&data,Node*node)const{//...}//SplayTree.cppusingBinary

c++ - typedef-name 作为基类 : illegal but widely tolerated

[class.derived]的第一段说的是基类说明符,Ifthenamefoundisnotaclass-name,theprogramisill-formed.但是,一个simple测试表明Comeau和g++-ansi-pedantic都接受typedef-name作为基础。Boostheader上的简单grep-r'[^:]:mpl'表明流行的库通常依赖于这种行为。是否有任何编译器实际上拒绝了基说明符中类的typedef?GCC甚至检查基类类型是否不是const,这改进了非标准功能。有解决办法吗?我唯一能想到的就是用C++11别名模板替换typedef。一个模板化的别名声明声明

c++ - 模板基类初始化

在visualc++中接受以下代码时,g++将生成错误:“类Derived没有任何字段名称Base”哪个符合标准?templateclassBase{public:Base(){};};templateclassDerived:publicBase{public:Derived():Base(){}};顺便说一句:两者都接受Derived():Base(){}所以同时,我会关注gcc 最佳答案 MSVC++不正确。Base是模板,不是类型。请注意,在通常情况下,Base在Derived的范围内查找,这意味着它将首先找到继承自Base

c++ - 在编译时通过模板自动判断类型是否为抽象基类

是否可以在编译时自动判断一个类是否为抽象基类?我有一个对象工厂,通过其他通用代码,它有时会用抽象基类类型实例化。该代码无法编译,因为它在ABC上调用了newT()。在这种情况下,我最终不得不专门为每个ABC创建代码的对象工厂来代替assert(0)。如果可以在编译时自动确定类型是否为ABC,则可以自动进行这种专门化。一个简化的例子如下://thisprogramcodecompilesw/gcc4.4#include#include//Howtoautomaticallyspecializethisclassatcompile-time?templatestructisAbstract

c++ - 为什么*everything* 在 ATL/WTL 中使用模板基类?

我很难理解ATL/WTL代码中模板的用途。当你查看WTL时,你会看到如下代码:templateclassCEditT:publicTBase{...};typedefCEditTCEdit;为什么是CEditT用模板基类定义?换句话说,在什么情况下会CEditT曾经在哪里实例化T是不是CWindow? 最佳答案 这样您就可以覆盖ATL::CWindow中由ATL/WTL类调用的方法。如果ATL::CWindow中有您不喜欢的内容,您可以使用覆盖的方法从ATL::CWindow派生一个类,然后传递您的新类作为TBase。例如,ATL:

c++ - 使基类指针表现得像 C++ 中的派生类

如果我从我的Shape基类创建一个指针,我如何才能让它表现得像圆(派生)类?这是我的类定义://CShape.hclassdefinition//Shapeclassdefinition#ifndefCSHAPE_H#defineCSHAPE_HclassCShape{protected:floatarea;virtualvoidcalcArea();public:floatgetArea(){returnarea;}};classCCircle:publicCShape{protected:intcenterX;intcenterY;floatradius;voidcalcArea(

c++ - 将基类的对象转换为派生类

几天前我问了一些clarificationsoninheritance,一个我仍在努力理解的概念。这是后续问题,因为我仍然面临问题。在我的项目中,我有两种类型的对象,手和脸,它们都继承自基类BodyPart。BodyPart是这样的:classBodyPart{public:typedefboost::shared_ptrBodyPartPtr;BodyPart();virtual~BodyPart();private:intcommonMember1;doublecommonMember2;public:intcommonMethod1();intCommonMethod2();}而

c++ - 基类的虚拟性为什么/如何改变复制构造函数的行为?

我不明白这段代码的行为:(用clang++3.0编译)#includeusingnamespacestd;classBase{public:virtualvoidbar(){}boolfoo=false;};classDerived:publicBase{public:Derived(){Base::foo=true;}};intmain(){Derivedd;Baseb(d);cout为什么函数Base::bar()对Base::foo的复制有任何影响? 最佳答案 您的问题看起来与reportedasabughere相似在llvm

c++ - 为什么我不能用 const_iterator 调用模板基类构造函数?

这个问题在这里已经有了答案:WhereandwhydoIhavetoputthe"template"and"typename"keywords?(8个答案)关闭8年前。由于某些原因,下面的代码给出了错误Symbol'TemplateBase'couldnotberesolved.:templateclassTemplateBase{TemplateBase(std::map::const_iteratoranIterator){}};classSubClass:publicTemplateBase{SubClass(std::map::const_iteratoranIterator)