草庐IT

c++ - 是否可以在编译时防止特定基类的多重继承?

我想做的是开发两个不同的基类,它们不应在一个派生类中一起继承。有什么办法可以在编译时强制执行此操作吗?classBase1{};classBase2{};classDerived1:publicBase1{}//OK!classDerived2:publicBase2,publicOther{}//OK!classDerived3:publicBase1,Base2{}//CanIforcethecompilertocomplain?Derived1d1;//OK!Derived2d2;//OK!Derived3d3;//OrcanIforcethecompilertocomplain

c++ - 如何解决没有标题的共享基类的循环类依赖?

所以我正在创建一个项目,其中涉及将vector相互嵌套,但该结构无法编译。我认为这是循环依赖的情况,但我看到的所有修复似乎只适用于涉及头文件和单独翻译单元的代码。#include#includeclassA{public:virtual~A();};//Thefollowingforwarddeclarationstatementsdidn'tsolvethe//compilererror://classC;//classC:publicA;classB:publicA{std::vectorAvector;public:voidaddC(C*Cin){Avector.push_bac

c++ - 从基类访问 union 的公共(public)部分

我有一个Result包含一些union的模板类error_type和T.我想在不求助于虚函数的情况下公开基类中的公共(public)部分(错误)。这是我的尝试:usingerror_type=std::exception_ptr;structResultBase{error_typeerror()const{return*reinterpret_cast(this);}protected:ResultBase(){}};templatestructResult:ResultBase{Result(){new(&mError)error_type();}~Result(){mError.

c++ - CRTP - 从基类检查派生类是否满足要求

奇怪的是,重复出现的模板模式可用于实现一种静态多态性。例如:#includetemplatestructBase{staticvoidprint(){std::cout{staticconstexprunsignedintnumber_to_print=27;};intmain(){Derived::print();}这符合预期并打印出27.现在,我想向基类添加检查以断言派生类满足某些要求。在上面给出的示例中,此类检查可能是:#include#includetemplatestructBase{//---Checksbeginstatic_assert(std::is_same::va

C++避免手动调用基类函数

我有一组这样的类:classA{public:intDoIt(){//commoncode}};classB:publicA{intDoIt(){if(A::DoIt()==1){return1;}else{//dobspecificcode}}};classC:publicA{intDoIt(){if(A::DoIt()==1){return1;}else{//docspecificcode}}};有什么方法可以避免手动输入这段代码:if(A::Doit()==1){return1;}else{在派生自A的每个类中? 最佳答案 只

c++ - 基类属性的不同初始化

考虑一个具有属性的基类classBase{protected:AttributeBase*elementPtr;...};还有一个派生类classDerived:publicBase{...};我还有一个类AttributeDerived派生自AttributeBase当我创建类Base的对象时,我希望elementPtr以这种方式初始化:elementPtr=newAttributeBase()但是当我创建类Derived的对象时,我希望elementPtr以这种方式初始化:elementPtr=newAttributeDerived()最干净的方法是什么?

c++ - 派生类能够访问其基类的私有(private)成员

我遇到了一种奇怪的情况,我的派生类能够访问其涉及模板的基类的私有(private)成员。考虑这个例子:classA{templatestructa{usingtype=a;};};classB:A{templateusingtype=typenamea::type;};intmain(){}编译结果:mingw64/mingw-w64-x86_64-clang3.9.1-3(来自MSYS2)$clang++-Walltest.cpp-otest.exe-std=c++14mingw64/mingw-w64-x86_64-gcc6.3.0-2(来自MSYS2)$g++-Walltest.

c++ - 基类和派生类中的同名对象不会被标记为错误

classBase{public:type1m_Pants;};classDerived:Base{public:type2m_Pants};这基本上没有被标记为错误,但在整个项目中造成了各种破坏和问题。有谁知道不会标记这个的技术问题? 最佳答案 它不会被标记为错误,因为它不是错误。没有任何内容表明派生类中的成员不能与基类中的成员同名。如果您有一个类型为Derived的对象obj,那么obj.m_Pants指的是m_Pants派生。如果你想引用基本成员,你可以使用obj.Base::m_Pants来实现。如果您在Base的成员函数中

c++ - 错误的私有(private)基类无法访问?

使用g++4.2.1编译此代码:structS{};templatestructST{};templateclassref_count:privateBaseType{};templateclassrep_base:publicRefCountType{};classwrap_rep:publicrep_base>{typedefrep_base>base_type;//line11};我得到:bug.cpp:1:error:‘structS’isinaccessiblebug.cpp:11:error:withinthiscontext但是,如果我将wrap_rep类更改为使用ST:

c++ - 在抽象基类中重载运算符的正确方法是什么?

假设我有一个抽象基类,它只定义了一个可以在其上执行加法的容器:classBase{public:virtual~Base(){}virtualBaseoperator+(constBase&rhs)=0;};然后我想要Base的子类来提供实际的操作:classDerived:publicBase{public:Baseoperator+(constBase&rhs){//won'tcompile//actualimplementation}};这是我的问题:operator+()应该返回一个新的Base对象,但Base是抽象的,它不会编译。我试图通过使用工厂返回对Base对象的引用来解