草庐IT

C++:虚拟继承

全部标签

c++ - 继承和 is_detected_v 提供了一个奇怪的结果 (C++17)

我有简化版的代码:#includetemplateusinghas_data_t=decltype(T::data());templateconstexprautoget_data(){returnstd::experimental::is_detected_v;}templatestructopt_base{staticconstexprbooli=get_data();//staticconstexprautoj=get_data();//failtocompile};structopt:publicopt_base{staticintdata(){return7;}};intma

c++ - vector_base 继承与组合

小问题:C++STL实现使用vector_base结构/类(处理资源和分配器)作为std::vector的基类是否有原因而不是使用组合?更长的版本:在我提高C++知识的“追求”中,我一直在尝试重新实现一个Vector类,主要是std::兼容。我想我已经很清楚为什么使用分配器是明智的,为什么你实际上想要在一个单独的类/结构(RAII和所有这些)中处理所有内存,但我不明白为什么我们想要std::vector从该类继承而不是将其作为私有(private)成员。LLVM和gcc例如,两者都使用继承。另一方面,我发现构造函数和赋值运算符(尤其是move类型)使用组合更容易处理。我只是暴露了我对这

c++ - 我可以在 C++ 中使用 [] 运算符来创建虚拟数组吗

我有一个庞大的代码库,最初是C语言,多年前移植到C++,它对大量空间数据的大型数组进行操作。这些数组包含表示点的结构和表示曲面模型的三角形实体。我需要重构代码,以便这些实体在内部存储的具体方式因特定场景而异。例如,如果点位于规则的平面网格上,我不需要存储X和Y坐标,因为它们可以即时计算,三角形也可以。同样,我想利用非核心工具,例如STXXL用于存储。最简单的方法是用put和get类型函数替换数组访问,例如point[i].x=XV;成为Pointp=GetPoint(i);p.x=XV;PutPoint(i,p);如您所想,这是对大型代码库进行的非常乏味的重构,在重构过程中容易出现各种

c++ - 使用多重继承进行转换

如果您有一个void*指针指向继承自BaseA和BaseB的派生类,编译器如何转换void*指向BaseA*(或BaseB*)的指针而不知道void*指针是Derived类型? 最佳答案 事实并非如此。使用static_cast与void*进行转换时的唯一保证是:Avalueoftypepointertoobjectconvertedto"pointertocvvoid"andbacktotheoriginalpointertypewillhaveitsoriginalvalue(C++03§5.2.9/10).例如,下面的代码是不

c++ - 模拟类可以从 googlemock 中的另一个模拟类继承吗?

模拟类可以从googlemock中的另一个模拟类继承吗?如果是,请帮助我理解为什么这不起作用。classIA{public:virtualinttest1(inta)=0;};classIB:publicIA{public:virtualfloattest2(floatb)=0;};classMockA:publicIA{public:MOCK_METHOD1(test1,int(inta));};classMockB:publicMockA,publicIB{public:MOCK_METHOD1(test2,float(floatb));};我得到一个cannotinstantia

C++,vs 2010 中的模糊继承错误

我在这个例子中对多态性的应用遇到了一些麻烦。这个问题和我上一个问题类似C++,virtualinheritance,strangeabstractclass+cloneproblem有3个抽象类:classA{public:virtualA*copy()const=0;virtual~A()=0;};A::~A(){}classB{public:virtualB*copy()const=0;virtual~B()=0;};B::~B(){}classC:virtualpublicA,publicB{public:virtualC*copy()const=0;virtual~C()=0;

c++ - 物理引擎的继承/接口(interface)决策

这是针对在MinGW/Windows上使用SDL的小型游戏项目。我正在研究一个物理引擎,我的想法是拥有一个Physics::Object,所有物理对象都应该派生自它,并且它会在全局Physics::中注册自己System类(这是一个单态模式),因此用户不需要跟踪哪些对象包含在物理计算中,只需要调用一个函数,如Physics::System::PerformTimestepCalculation(doubledt)。这很好用,我什至使用一个派生类Physics::Circle实现它,这是一个二维圆。我对预测碰撞检测非常满意,尽管我仍然需要对其进行优化。无论如何,当我开始添加其他原语以包含

c++ - 依赖注入(inject)/继承设计模式的构造函数参数太多

所以我决定结合使用工厂设计模式和依赖注入(inject)。classClassA{Object*a,*b,*c;public:ClassA(Object*a,Object*b,Object*c):a(a),b(b),c(c){}};classClassB:publicClassA{Object*d,*e,*f;public:ClassB(Object*a,Object*b,Object*c,Object*d,Object*e,Object*f):ClassA(a,b,c),d(d),e(e),f(f){}};现在,问题是classB的构造函数参数太多。这是一个单继承层的例子,但是当继承

c++ - 基础和派生虚拟析构函数的影响

我对多个虚拟析构函数有了一些重新考虑,尤其是。读后阅读http://blogs.msdn.com/b/oldnewthing/archive/2004/05/07/127826.aspx.假设我有classBase{public:Base();virtual~Base();private:Logger*_logger;};//andclassDerived:publicBase{public:Derived();virtual~Derived();private:Logger*_logger;};在cpp文件中,在每个析构函数中我删除了相应的_logger指针Base::~Base()

c++ - 虚拟多重继承

我偶然发现了这个代码示例:#includeusingnamespacestd;classA{intx;public:A(){x=1;coutThiscodeprintsABABCD我不知道为什么。我认为它会打印AforD:publicA,然后ABforD:publicB,然后ABCforD:publicC,然后是D,但似乎A只打印了两次。这是如何工作的? 最佳答案 基的构建顺序是(忽略虚拟基)从左到右,因为它们是在继承关系中键入的。添加虚拟基础后,它们将以从左到右的深度优先方式首先(在任何非虚拟基础之前)初始化。现在应该可以解释输出