草庐IT

c++ - 基类和派生类的复制构造函数

我有这两个类///////////BASECLASSclassBase{public:Base(int=0);~Base();Base(Base&);Base(Derived&);////我读到如果我的派生类没有复制c'tor将调用基的复制c'tor但每次我收到从Base到非标量的转换typeDerivedrequested谁错了?我的编译器或我的书,还是我误解了?提前致谢 最佳答案 只是一个提示。下面的代码是否给出同样的错误?classbase{};classderived:publicbase{};intmain(){deriv

c++ - 在派生类中重写运算符 new/delete

我有一个无状态的抽象基类,各种具体类都从中继承。其中一些派生类也是无状态的。因为它们中的许多是在运行期间创建的,所以我想通过覆盖运算符new()/delete()让所有无状态派生类模拟单例来节省内存和开销。一个简化的例子看起来像这样:#includestructBase{virtual~Base(){}protected:Base(){}//preventconcreteBaseobjects};structD1:publicBase{//statefulobject--defaultbehaviorintdummy;};structD2:publicBase{//statelesso

c++ - 派生类中的显式模板静态成员实例化

我正在尝试使用静态成员实现模板类。从模板类派生的类应该被实例化,而不需要编写额外的代码。这是我天真的(但不成功)的方法:Singleton.h:templateclassSingleton{protected:Singleton();staticTinstance_;}//explicitinstantiationof'instance_'???,//where'instance_'isaninstanceofthederivedclasstemplateTSingleton::instance_;混凝土A.h:classConcreteA:publicSingleton{public

c++ - 在虚函数中访问派生类成员变量

classCar{classBaseState{explicitBaseState(Car*vehicle):mVehicle(vehicle){}virtualvoidrun()=0;Car*mVehicle;}classState1:publicBaseState{explicitState1(Car*vehicle):BaseState(vehicle){}virtualvoidrun(){//usedataofCar...doSomething();}virtualvoiddoSomething(){}}classState2:publicBaseState{}...}clas

c++ - 派生类中vtable的理解

我试图通过虚拟表和继承来理解一些低级的东西。当您通过继承两个类并添加新的虚函数来创建新类时,vptr将存储在哪里?在我看来,编译器在那种情况下会执行一些“vptr优化”。我正在努力弄清楚。假设,我们有以下结构:structA{inta;virtualvoidfa();};structB{doubleb;virtualvoidfb();};structC:A,B{charc;virtualvoidfa();virtualvoidfb();virtualvoidfc();};在x86和align=4的情况下,内存中的A和B将如下所示:+------+------+A:|vptr|a|+--

c++ - 如何让派生类在调用基类之前做一些 Action ?

首先:我不是开发人员,我可能无法理解您的某些信息,而且由于英语不是我的母语,我的问题可能很难理解。考虑:classMyVector{std::vectorvec;std::mutexvector_m;public:voidMVpush_back(commandt){this->vector_m.lock();this->vec.push_back(t);this->vector_m.unlock();}};command是一个自定义类(它的内容在这里似乎不相关;复制构造函数确实存在)。基本上,因为我有很多可能的作者和读者,所以我想强制使用mutex访问vec参数。因为我只会使用push

c++ - 通过指向其派生类的指针访问类对象是否会违反严格的别名规则?

voidfoobar(Base*base){Derived*derived=dynamic_cast(base);//orstatic_castderived->blabla=0xC0FFEE;if(base->blabla==0xC0FFEE)...}在具有严格别名的编译器上,“derived”是“base”的别名吗? 最佳答案 只要有可能通过它们访问同一个对象,两个指针就被别名化了。该标准的第3.10/15段指定了对对象的访问何时有效。Ifaprogramattemptstoaccessthestoredvalueofanobj

c++ - 公共(public)基类的派生类的 TypeID

我正试图在C++中实现某种机制,从而为从公共(public)基类派生的所有类分配一个唯一的“类ID”。例如:classBaseClass{//...public:unsignedintGetID(void);//...};classDerivedClass:publicBaseClass{}DerivedClass类和BaseClass的所有其他子类应该能够返回唯一标识符,而无需向DerivedClass添加任何额外代码……然而,C++使这对我来说相当困难。任何想法将不胜感激。提前致谢!---丹 最佳答案 你应该听听Alf的话:)这

c++ - 在 C++ 中从自身派生模板类

在我被要求处理的一部分遗留代码中,我遇到了一个我不理解的概念。在SO中搜索和谷歌搜索并没有多大帮助,因此出现了这个问题。有一个模板类如下所示:templateclassCommandHandlerGeneric:privateCommandHandlerGeneric{public:CommandHandlerGeneric(Protocol&Shared,CmdHandlerBase**Cont):CommandHandlerGeneric(Shared,Cont){}};CmdHandlerBase类是一个非模板类,存在于不同header的其他位置。按照上面的定义,有一个看起来像这

c++ - 派生类与基类的 std::shared_ptr 的使用

下面的方法好不好?classTA{};classTB:TA{};std::shared_ptrspta;spta.reset(newTB); 最佳答案 显示的代码有一个问题,TB必须公开继承自TA.你有一个shared_ptr,所以你想要存储在其中的指针必须可以转换为TA,但带有private继承,基础不可访问,因此您的代码将无法编译。classTA{};classTB:publicTA{};除此之外,代码没有错误并且运行良好。通常,通过基类指针对派生类实例进行多态删除时,需要基类的析构函数为virtual。所以派生类析构函数被调用