草庐IT

C++:虚拟继承

全部标签

c++ - 具有共享继承的 C++ 中的多态性

我正在考虑实现一套在GIS中使用的点类型,它们是2D(xy)、3D(xyz或xym)或4D(xyzm)。M坐标是测量坐标,其他的应该是显而易见的。但是,我似乎无法弄清楚如何使PointZM类共享Pointx和y成员类。这是我的代码:#includeclassPoint{public:doublex,y;Point(doublexNew,doubleyNew):x(xNew),y(yNew){};};classPointZ:publicPoint{public:doublez;PointZ(doublexNew,doubleyNew,doublezNew):Point(xNew,yNew

c++ - 通过继承扩展 shared_ptr

做这样的事情有什么不好?classmyclass:publicstd::shared_ptr{//somecode,anallocationisneverdonestd::stringget_info(){if(*this!=nullptr)return""+(this->info*3)+"";elsereturn"";}};当类中没有分配时---只是像上面那样提供一些装饰? 最佳答案 原则上允许从STL类派生,参见here和here.但是,您必须知道您不应该使用指向基类的指针——即std::shared_ptr*。在这种情况下。所

c++ - 从 const 类继承

我想从一个带有const说明符的类继承,如下所示:classProperty{intget()const;voidset(inta);};classConstChild:publicconstProperty{//CannevercallA::set()withthisclass,evenif//theinstantiationofthisclassisnotconst};classNonConstChild:publicProperty{//CancallbothA::set()andA::get()dependingon//theconstnessofinstantiationof

c++ - 继承构造函数、默认构造函数和可见性

如[namespace.udecl]/18所述:[...]Ausing-declarationthatnamesaconstructordoesnotcreateasynonym;instead,theadditionalconstructorsareaccessibleiftheywouldbeaccessiblewhenusedtoconstructanobjectofthecorrespondingbaseclass,andtheaccessibilityoftheusing-declarationisignored.[...]因此,以下代码无法编译:classB{protect

c++ - 为什么 gcc 警告使用 std::tuple 和虚拟继承调用非平凡的移动赋值运算符?

在下面的例子中,gcc7给出了警告:defaultedmoveassignmentfor'B'callsanon-trivialmoveassignmentoperatorforvirtualbase'A'[-Wvirtual-move-assign]如果我创建一个std::tuple目的。Clang5没有报告任何问题。如果vector,问题也会消失从Base中删除.Example.#include#includeclassBase{public:virtual~Base();std::vectorv;};classA:publicBase{};classB:publicvirtual

c++ - 删除 C++ 继承中虚拟类成员的代码重复

我现在陷入了一个奇怪的问题。我将编写一个真正简化的版本。classBase{public:virtualintfunc1()=0;virtualintfunc2()=0;protected:intn;};classder1:publicBase{//implementsthevirtualfunctionsofthebaseandusestheprotecteddata//membersofthebase.};classder2:publicBase{//implementsthevirtualfunctionsofthebaseandusestheprotecteddata//mem

C++ 虚拟构造函数,没有 clone()

我想对包含多态类指针的STL容器执行“深度复制”。我知道Prototype设计模式,通过VirtualCtorIdiom实现,如C++FAQLite,Item20.8中所述。.它简单明了:structABC//AbstractBaseClass{virtual~ABC(){}virtualABC*clone()=0;};structD1:publicABC{virtualD1*clone(){returnnewD1(*this);}//CovariantReturnType};那么深拷贝是:for(i=0;iclone());缺点作为AndreiAlexandrescustatesit

修改Android Studio的SDK和虚拟机AVD存储目录,减少C盘磁盘占用

修改AndroidStudio的SDK和虚拟机AVD存储目录,减少C盘磁盘占用:在网上看了很多的文章介绍的修改虚拟机默认存储路径的方法都是移动avd目录然后修改.ini文件;我按照这些方法去做,结果是AS并不认账,重新在原来的默认目录C:\Users\\.android\avd下重新创建了原来的虚拟机,无法实现声称的效果。经过自己的摸索,发现了一种切实可行的修改AS默认虚拟机AVD存储目录和SDK目录的方法:一、修改android虚拟机的磁盘存储路径在AS的设备管理器DeviceManager中删除原来创建的所有虚拟机(AndroidVirtualDevice);新建一个自定义的AVD目录,例

c++ - sleep 影响哪个虚拟成员函数被std::thread调用?

我不确定这是否是c++11中的预期行为。这是我发现的一个例子。#include#includeusingnamespacestd;classA{public:virtualvoida()=0;threadt;A():t(&A::a,this){}virtual~A(){t.join();}};classB:publicA{public:virtualvoida(){cout编译运行时$g++-std=c++11-pthreadtest.cpp-otest$./testB::a$但是当sleep被移除时...intmain(){Bb;//this_thread::sleep_for(ch

c++ - 内存中的虚拟表布局?

虚拟表是如何存储在内存中的?他们的布局?例如classA{public:virtualvoiddoSomeWork();};classB:publicA{public:virtualvoiddoSomeWork();};A类和B类的虚表在内存中会如何布局? 最佳答案 对于Linux中的GCC编译器,运行:g++-fdump-class-hierarchyexample.h输出是:VtableforAA::_ZTV1A:3uentries0(int(*)(...))08(int(*)(...))(&_ZTI1A)16(int(*)(.