草庐IT

c++ - 继承和显式构造函数?

考虑以下代码:templateclassBase{Base();Base(constBase&rhs);templateexplicitBase(constBase&rhs);template::value>::type>Base(constT0&rhs);explicitBase(conststd::string&rhs);};templateclassDerived:Base{Derived();Derived(constDerived&rhs);templateDerived(constT0&rhs):Base(rhs);//Isthereawayto"inherit"theex

c++ - 隐式构造函数可用于从 Base 派生的所有类型,但当前类型除外?

以下代码总结了我的问题:templateclassBase{};templateclassDerived1:publicBase{};templateclassDerived2:publicBase{public://CopyconstructorDerived2(constDerived2&x);//AnEXPLICITconstructorthatdoesaspecialconversionforaDerived2//withothertemplateparameterstemplateexplicitDerived2(constDerived2&x);//Nowtheproble

c++ - 在复制赋值运算符中分配基类成员

我有一个继承自MSFT类的类,因此无法更改,我希望派生类的复制构造函数和复制赋值运算符具有相同的行为。我遇到的问题是,在复制构造函数中,您可以自由地为初始化列表中的基类调用构造函数,但在运算符中,这不是一个选项。如何在赋值运算符中正确地重新创建此行为?仅在运算符重载的主体中调用基类的构造函数就足够了吗?附加说明:基类继承自CObject,它具有operator=()和复制构造函数作为私有(private)和未实现的方法,因此不幸的是,对这些方法的任何调用都会导致编译错误。我在下面提供了一个简化的代码场景:类声明:classBase{protected:intbaseInt;public

c++ - 在C++中模拟虚拟构造函数

在我的应用程序中,我必须从基类派生一些类,问题是我想强制派生类具有3个特定的构造函数实现。由于c++没有虚拟纯构造函数,这似乎很绝望(我不得不手动检查每个类的实现以确保实现了特定的ctors,这不是很有趣)。昨天我发现了一种模拟虚拟Actor行为的疯狂方法:templateclassAbstractEnforcer{protected:AbstractEnforcer(){}private:staticvoidEnforcer(){deletenewT();deletenewT(*(newunsignedint));deletenewT(*(newunsignedint,*(newQS

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++ - 在调用基类构造函数之前修改构造函数参数值

我有以下类层次结构:classBase{//Thisclasscannotbemodifiedpublic:Base(inta,intb,intc){if(a==100&&b==200&&cclassDerived在代码中用的很多地方,所以不能用某种工厂函数代替。现在的问题是是否有某种构造允许我在调用Base构造函数之前修复a、b、c值?我知道我可以使用如下函数:Derived(inta,intb,intc):Base(FixA(a),FixB(b),FixC(c)){}intFixA(inta){/*fixavalue*/returna;}intFixB(intb){/*fixbva

c++ - 在C++中将派生类指针分配给基类指针

我有关注classbase{};classderived:publicbase{public:derived(){}voidmyFunc(){cout现在我有base*pbase=newderived();pbase->myFunc();我收到错误myFunc不是base的成员函数。如何避免这种情况?以及如何让myFunc被调用?注意我应该让基类不包含函数,因为它是设计的一部分,上面的代码是大函数的一部分 最佳答案 如果您坚持认为此函数不应成为base的一部分,那么您只有2个选择。要么使用指向派生类的指针derived*pDeriv

c++ - C++17中类模板的模板参数推导 : am I doing it wrong?

根据https://gcc.gnu.org/projects/cxx-status.html,g++版本7,与标志一起使用-std=c++1z,支持类模板的模板参数推导。我希望下面的代码能够编译,尤其是Base是一个抽象类,因此:1.编译器不知道Base的实例可以创建;2.指向基址的指针pt_base指向明确定义的实例(即Derived{42}),其中类型(int)是显式的。templateclassBase{public:virtualValueTypegetValue()=0;};templateclassDerived:publicBase{public:Derived(Valu

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