草庐IT

derivation

全部标签

c++ - CRTP与 "derived"中函数的直接实现

我正在尝试更好地了解CRTP。到目前为止,我的理解是它允许编写如下函数。templatevoidfoo(Basex){x.do_stuff()}现在,根据传递给函数foo()的实际编译时派生对象x,它会做不同的事情。但是,我可以从Base派生类Derived并使用非虚拟但覆盖的方法屏蔽/隐藏它的do_stuff()Derived::do_stuff。那么什么时候使用CRTP才是正确的,而不是最简单的重要示例,它显示了CRTP相对于阴影/掩码的优势。 最佳答案 CRTP的重点是能够在没有虚拟性的情况下获得派生对象的类型。如果你这样做s

c++ - 持有对 Derived 的引用的基类

我想这样做:structDerived;structBase{Derivedconst&m_ref;Base(Derivedconst&ref):m_ref(ref){}};structDerived:Base{Derived():Base(*this){}};但我似乎得到了不可靠的行为(稍后使用时,m_ref指向无效派生的事物)。是否允许在类初始化之前构造对Derivedfrom*this的引用?我知道在初始化之前使用这样的引用是无效的,但我不明白对类初始化的更改会如何影响对它的引用(自初始化以来它不会在内存中四处移动...)。我不确定如何称呼我正在尝试做的事情,所以我搜索这方面的信

c++ - 如何将 Base 对象分配给 Derived 对象

我有一个关于C++的问题,如何将Base对象分配给Derived对象?或者如何将指向Base对象的指针分配给指向Derived对象的指针?在下面的代码中,两行是错误的。如何纠正?#includeusingnamespacestd;classA{public:inta;};classB:publicA{public:intb;};intmain(){Aa;Bb;b=a;//whathappend?coutb 最佳答案 将基对象分配给派生对象(或将基指针分配给派生指针)是没有意义的,因此C++将尽力阻止您这样做。异常(exception

c++ - 菱形多态继承 : sizeof Most derived Class

我知道菱形继承会导致歧义,可以通过virtualBaseClasses使用继承来避免,问题不在于此。当类是多态时,问题是关于菱形层次结构中最派生类的大小。这是示例代码和示例输出:#includeusingnamespacestd;classBase{public:virtualvoiddoSomething(){}};classDerived1:publicvirtualBase{public:virtualvoiddoSomething(){}};classDerived2:publicvirtualBase{public:virtualvoiddoSomething(){}};cl

c++ - 在 C++ 中为类创建赋值 (=) 运算符

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Operatoroverloading编辑2我错误地使用了insert(...),我实际上并不需要“=”运算符。抱歉浪费了大家的时间。我已投票结束。还剩2票。请投票。编辑我想要“=”运算符的原因是我可以在Derivation对象的vector上使用insert(...)函数。目前我的编译器说:/usr/include/c++/4.2.1/bits/STL_algobase.h:283:错误:'*__result=*__first'中的'operator='不匹配我之前已经为自己的类创建了“==”和“class

c++ - 为什么 sizeof(Base) 与 sizeof(Derived) 没有区别

我觉得sizeof(Base)应该是12,为什么是16?没有虚函数,我得到4和8。classBase{public:inti;virtualvoidPrint(){cout预期结果:12,16实际结果:16,16 最佳答案 whysizeof(Base)isnotdifferentofsizeof(Derived)因为编译器引入了对齐。这是架构相关的,但为了简单起见,我假设我们指的是64位架构。Scenario64bit/Clang8.0.类型的对齐Base是8字节数:alignOfBase():#@alignOfBase()mov

c++ - 为什么编译器不在 Derived 类构造函数的定义中提示?

请注意Derived类构造函数有ii作为它的第一个参数,但参数传递给了Base等于i故意。classBase{protected:inti;public:Base(inti):i(i){}};classDerived:publicBase{private:intk;public:Derived(intii,intk):Base(i),k(k){}//WhynotC2065:'i'undeclaredidentifier};intmain(){} 最佳答案 因为i是继承自Base的成员变量,所以是定义的。您可以自由访问初始化列表中的成

c++ - 在头文件和源文件中包含相同的 include derivate 是标准做法吗?

在使用say时,C++中的标准字符串类。你需要#include吗在头文件和源文件上?你能不能只拥有#include只在头文件上? 最佳答案 包含在头文件中可能表示类定义级别的依赖性(例如,您正在接受或返回字符串)。在这种情况下,您必须将include放在标题中;但是,如果您只在实现中使用字符串,则可能只需要在源文件中包含。 关于c++-在头文件和源文件中包含相同的includederivate是标准做法吗?,我们在StackOverflow上找到一个类似的问题:

c++ - Derived 到 MatrixBase<Derived> 转换背后的故事

当您将矩阵对象作为MatrixBase引用传递给函数时会发生什么?我不明白幕后到底发生了什么。示例函数代码如下:#include#includeusingnamspaceEigen;templatevoidprint_size(constMatrixBase&b){std::coutm;m它给出了以下输出:size(rows,cols):4(2,2)11616比1的差异从何而来?还有为什么需要转换?提前致谢! 最佳答案 sizeof在编译时进行评估,因此它与声明的(静态)对象类型有关。b类型为MatrixBase(忽略引用,就像si

c++ - 这是正确的 : virtual method of Derived called before constructing Base object?

我知道在Base类的构造函数中-当调用虚拟方法时-调用Base方法,而不是派生-参见Callingvirtualfunctionsinsideconstructors.我的问题与这个主题有关。我只是想知道如果我在Derived类构造函数中调用虚拟方法会发生什么-但在构造Base部分之前。我的意思是调用虚方法来评估基类构造函数参数,请参见代码:classBase{public:Base(constchar*name):name(name){cout编译器g++(4.3.x-4.5x版本)输出为:Derived::getName()Base():DerivedDerived():Deriv