草庐IT

c++ - 为什么不能将指向派生类的指针传递给期望引用指向基类的指针的函数?

很抱歉标题太长,但我确实想具体一点。我希望下面的代码可以工作,但它没有,我不知道为什么:/#include#includeclassUniquePointer{public:voidDispose(){deletethis;}friendvoidSafeDispose(UniquePointer*&p){if(p!=NULL){p->Dispose();p=NULL;}}protected:UniquePointer(){}UniquePointer(constUniquePointer&){}virtual~UniquePointer(){}};classBuilding:publi

c++ - C++ 模板基类的编译器警告

我收到一个编译器警告,在这种情况下我不明白。当我从以下代码编译“Child.cpp”时。(不要奇怪:我将我的类声明剥离到最低限度,所以内容没有多大意义,但你会更快地看到问题)。我收到警告Visual Studio 2003和Visual Studio 2008处于最高警告级别。代码AbstractClass.h:#includetemplateclassAbstractClass{public:virtualvoidCancel();//{std::coutvoidAbstractClass::Cancel(){std::coutChild.h:#include"AbstractCla

c++ - 基类何时可以具有与相应的完整对象类型不同的布局?

在调用基类构造函数时,GCC和Clang不执行C++17的保证复制省略;见thisquestion和相应的Clangbugreport了解详情。针对错误报告,RichardSmithstates:Thisisadefectinthestandardwording.Copyelisioncannotbeguaranteedwheninitializingabaseclasssubobject,becausebaseclassescanhavedifferentlayoutthanthecorrespondingcompleteobjecttype.在什么情况下,基类可以具有“与相应的完整

c++ - 从抽象基类的多个部分实现继承?

是否有可能有多个抽象接口(interface)的部分实现,然后收集这些部分实现到一个单个具体类通过使用多重继承?我有以下示例代码:#includestructBase{virtualvoidF1()=0;virtualvoidF2()=0;};structD1:Base{voidF1()override{std::cout编译失败,出现以下错误:main.cpp:Infunction‘intmain()’:main.cpp:27:11:error:cannotdeclarevariable‘d’tobeofabstracttype‘Deriv’main.cpp:19:8:note:be

c++ 抽象基类私有(private)成员

只是想澄清一下。抽象基类不应该有私有(private)成员吗?例如classabc{public:virtualvoidfoo()=0;private:intmyInt;}您永远无法访问myInt,因为您无法创建abc的实例,并且它不会在派生类中,因为它是私有(private)的。有没有在抽象基类中使用私有(private)成员的情况,或者这是错误的? 最佳答案 在C++中,您可以拥有一个包含非纯虚方法的抽象类。在这种情况下,根据设计,拥有私有(private)成员是有意义的:classbase{std::stringname;pu

c++ - "using"基类变量的关键字

我正在查看WildMagic5引擎(www.geometrictools.com),其中Vector类继承自Tuple类,该类具有特定大小的数组,名为mTuple[](由模板参数设置)。到目前为止一切顺利,没什么特别的。然而,在Vector类中,我看到以下内容:protected:usingTuple::mTuple;现在我知道using关键字用于正确继承重载方法。在这种情况下,我总是假设该变量可用于派生类,而无需键入上述代码。以上有必要吗?还是只是为了让事情更清楚? 最佳答案 通用编程与面向对象编程略有不同。您的mTuple是一个

c++ - 模板基类 typedef 成员不可见

我知道编译器默认看不到“依赖名称”这一事实。但是在回答其他SO问题(here、here和最终ontheC++faq)时,有人告诉我using声明可能会有所帮助。所以我尝试了。模板基类://regardlessofthefactthatmembersareexposed...templatestructTBase{typedefTMemberType;MemberTypebaseMember;MemberTypebaseFunction(){returnMemberType();}};还有一个派生类,使用基类的成员:templatestructTDerived:publicTBase{/

c++ - 为什么 C++ 不允许基类实现派生类的继承接口(interface)?

这就是我要说的//someguywrotethis,usedasaPolicywithtemplatesstructMyWriter{voidwrite(std::vectorconst&data){//...}};在一些现有的代码中,人们没有使用模板,而是使用interfaces+type-erasureclassIWriter{public:virtual~IWriter(){}public:virtualvoidwrite(std::vectorconst&data)=0;};其他人希望同时使用方法和写入classMyOwnClass:privateMyWriter,public

C++从多个具有相同虚函数名的基类继承

我试过这段代码:classA{virtualvoidfoo()=0;};classB{virtualvoidfoo()=0;};classC:publicA,publicB{//virtualvoidA::foo(){}//virtualvoidB::foo(){}virtualvoidA::foo();virtualvoidB::foo();};voidC::A::foo(){}voidC::B::foo(){}intmain(){Cc;return0;}使用注释部分是可以的,但是当我尝试在类声明之外编写定义时,编译器会报错。我正在使用MSVC11编译器,有人知道如何编写吗?我需要将

c++ - 有没有更直接的方法将基类方法带入子类?

考虑structBase{intfoo(int);intfoo(int,int);};structChild:Base{usingBase::foo;intfoo(int,int,int);};理想情况下,我想将只接受一个int作为参数的Base类foo带入Child类,而不是需要2个ints的类。有没有办法我可以做到这一点?我的写作usingBase::foo;引入了Base的两个foo方法。 最佳答案 using声明将使所有重载可用。你无法阻止这种情况发生。但是你可以在事后delete你不想要的重载:structBase{int