草庐IT

c++ - 在扩展派生自的模板之前访问模板的基类

我正在尝试从模板中公开派生一个类,这将使它从基类继承并获得对protected成员的访问权限。但是在模板展开之前它没有这些权限,所以它不能使用Base成员作为模板参数:usingFun=void(*)();classBase{protected://friendclassDerived;//...needthistoeliminatecomplaintstaticvoidsomething();};templateclassVariant:publicBase{};classDerived:publicVariant{//`something()`isprotectedpublic:v

c++ - 在具有菱形继承和虚拟基类的类中调用函数的策略

如果我们有菱形继承并使用公共(public)虚拟基类,我们可以阻止第一个构造函数被多次调用。现在,我想对构造函数之外的函数做同样的事情。例如代码:#includestructA{virtualvoidfoo(){std::cout产生结果ABACD我想修改它,让它只产生ABCD什么样的策略或模式可以做到这一点?编辑1与以下相比,我更喜欢TonyD的回答。尽管如此,理论上可以使用另一个类的构造函数来定义适当的函数层次结构。具体#includestructA;structB;structC;structD;namespacefoo{structA{A(::A*self);};structB

c++ - 基类和派生类中的模板成员之间的重载解析

Microsoft编译器(VisualStudio201715.2)拒绝以下代码:#includestructB{template=0>voidf(){}};structD:B{usingB::f;template=0>voidf(){}};intmain(){Dd;d.f();d.f();}错误是:errorC2672:'D::f':nomatchingoverloadedfunctionfounderrorC2783:'voidD::f(void)':couldnotdeducetemplateargumentfor'__formal'note:seedeclarationof'D

c++ - 使用基类实例创建派生类实例

我有一个基类实例,有一个继承自基类的派生类,我想将基类实例转换为派生实例,(如果可能的话不复制任何东西(可能向派生类发送一个基类))我该如何实现?注意:我需要这个,因为我使用的是工厂设计模式,它标识需要使用位于基实例中的参数创建的派生类。//classA//classB:publicA(purevirtual)//classC:publicBBBFactory::makeB(A&a){intn=a.getN();if(n==1){returnnewC();}}谢谢。 最佳答案 考虑汽车的情况。您可以将兰博基尼视为汽车。您可以将Yug

c++ - 如何禁止隐式转换为基类?

我想在我的代码中清楚地区分3D和2D点。显而易见的解决方案是拥有单独的类。另一方面,从z=0的3D点到2D点的转换非常普遍。因此我想使用一个公共(public)基类,这样我就可以在内存中就地进行这些转换。为了明确区分类型,我想禁止隐式转换为该基类。这可行吗?或者是否有不同的方法来创建具有类似功能的不同类型? 最佳答案 您可以私下派生子类:classPointBase{//...};classPoint2D:privatePointBase{//...};classPoint3D:privatePointBase{//...};这种方

c++ - 结构作为基类 - C/C++ 互操作性

我记得我在某处看到过一些代码,这些代码曾经将结构作为基类,将C++类作为派生类structBase_Struct{}classDerived:Base_Struct{...}重点是指向Base_Struct*的指针从C++文件传递​​到一些C文件,然后这些文件设法使用Base_Struct中的一些函数指针。我的问题是:如果我将Base_Struct*传递给C文件,C代码是否能够完全使用Base_Struct?派生类呢? 最佳答案 IfIpassBase_Struct*toaCfile,willtheCcodebeabletouset

c++ - 使用 typedeffing 模板化基类来简化代码是一种好习惯吗?

最近在处理许多模板化类并从它们派生时,我发现自己“发明”了这个简单的结构。我不确定这是常见做法,还是我在脖子上系了一根绳子。templateclassBase{};templateclassDerived:publicBase{typedefBaseBase;};我发现如果Base它特别有用类有自己的typedefs对于某些类型。例如:templateclassBase{typedefTScalar;typedefMatrixMatrix;};然后很容易将类型“导入”到Derived中.它节省了重新键入模板签名。例如:templateclassDerived:publicBase{ty

c++ - 初始化列表是否适用于基类?

初始化列表是否适用于基类?如果是这样,如何?例如structA{inti;};structB:publicA{doubled;};intmain(){Bb{A(10),3.4};return0;} 最佳答案 标准的第8.5.1节定义了聚合:Anaggregateisanarrayoraclass(Clause9)withnouser-providedconstructors(12.1),nobrace-or-equal-initializersfornon-staticdatamembers(9.2),noprivateorprot

c++ - 如何从非多态虚基类向下转型?

有没有办法在不涉及虚函数的情况下从虚基类向下转型为派生类?下面是一些代码来演示我在说什么:structBase1{intdata;};structBase2{charodd_size[9];};structViBase{doublevalue;};structMostDerived:Base1,Base2,virtualViBase{boolok;};voidfoo(ViBase&v){MostDerived&md=somehow_cast(v);//butHOW?md.ok=true;}intmain(){MostDerivedmd;foo(md);}请注意,该代码仅用于演示。我的真

c++ - 具有基于 protected 基类方法的返回类型的函数

我试图让doSomeMethod()的返回类型与operator()相同在基类中,但如果它被声明为protected,编译器将拒绝带有error:notypenamed'type'in'std::result_of'的代码.如果它是公开的,它就可以工作,但我想知道从那以后我是否也可以让它为protected案例工作。这是重现错误的简单代码。#includeclassbase{protected:intoperator()(){return1;};};classchild:privatebase{autostaticdoSomeMethod()->typenamestd::result_