草庐IT

c++ - 使用自动从基类返回类型与派生类的冲突

我有以下代码:structA{};structBase{virtualA&internal()=0;};structDerives:publicBase{auto&internal()override{//这无法通过冲突的返回类型进行编译(在coliru上测试-使用gcc)-我的问题是为什么编译器不能推断出internal_(因此返回类型)是A?是否在不同的编译阶段为auto推导出类型,例如与检查虚拟覆盖的编译阶段?当然,如果您将auto替换为正确的类型,则可以编译-但这不是重点。(这里是clang错误,gcc有点类似)main.cpp:8:11:error:returntypeofv

c++ - 模板基类类型定义和函数的更好 C++ 语法?

我的代码可以用VC9(MicrosoftVisualC++2008SP1)编译,但不能用GCC4.2(在Mac上,如果重要的话)编译。如果我堆积足够多的限定符和关键字,我可以强制它在GCC中工作,但这似乎不对。这是展示我的问题的最小代码示例:templatestructB{typedefNn_type;//canderivedclassaccesstypedef?voidfoo(){}//canderivedclassaccessfunction?};templatestructD:publicB{typedefBb_type;typedeftypenameb_type::n_type

c++ - 对基类模板成员函数的访问不明确

在VisualStudio2008中,编译器无法解析下面_tmain中对SetCustomer的调用并使其明确:templatestructProducer{voidSetConsumer(TConsumer*consumer){consumer_=consumer;}TConsumer*consumer_;};structAppleConsumer{};structMeatConsumer{};structShillyShallyProducer:publicProducer,publicProducer{};int_tmain(intargc,_TCHAR*argv[]){Shil

c++ - 在基类指针上删除 [] 后出现段错误

这个问题在这里已经有了答案:Whyisitundefinedbehaviortodelete[]anarrayofderivedobjectsviaabasepointer?(5个答案)关闭4年前。我这里有一段代码,我不明白为什么它会导致第22行(delete[]语句)出现段错误。你能给我解释一下吗?#include#includeclassA{size_ta[1000];public:virtual~A(){}};classB:publicA{public:floatb;virtual~B(){}};intmain(intargc,char**argv){A*b;b=newB[10]

c++ - 为什么在对基类的 const 引用上调用派生类的析构函数?

在GMan'sanswerhere,restore_base类的析构函数不是virtual,所以我一直想知道它究竟是如何工作的。通常您希望restorer_base的析构函数仅在对象超出范围后执行,但派生的restorer_holder析构函数似乎真的被调用了。有谁愿意赐教吗? 最佳答案 需要虚拟析构函数的标准情况是voidfoo(){scoped_ptrobj=factory_returns_a_Derived();//...use'obj'here...}而您不的标准情况是voidfoo(){Derivedobj;//...us

c++ - 虚拟基类上的虚拟方法

关于虚拟基类继承的一些事情一直让我感到困惑......给定以下类:classA{virtualvoidfoo()=0;}classB:virtualA{voidfoo(){/*doX*/}}classC:virtualA{voidfoo(){/*doY*/}}classD:B,C{}这会编译吗?如果是这样,以下代码的结果是什么:Dd;A*a=&d;a->foo(); 最佳答案 它不应该编译,函数foo会产生歧义。由于A::foo()是纯虚函数,因此必须解决歧义。 关于c++-虚拟基类上的

c++ - 从子类方法访问基类变量

如何从子方法访问基类变量?我遇到了段错误。classBase{public:Base();inta;};classChild:publicBase{public:voidfoo();};Child::Child():Base(){voidChild::foo(){intb=a;//herethrowssegmentationfault}在另一个类中:Child*child=newChild();child->foo(); 最佳答案 将类变量公开不是一个好习惯。如果你想从Child访问a你应该有这样的东西:classBase{publ

c++ - 不从派生类调用基类构造函数

假设我有一个基类:classbaseClass{public:baseClass(){};};派生类:classderClass:publicbaseClass{public:derClass(){};};当我创建derClass的实例时,将调用baseClass的构造函数。我怎样才能避免这种情况? 最佳答案 创建一个额外的空构造函数。structnoprapere_tag{};classbaseClass{public:baseClass():x(5),y(6){};baseClass(noprapere_tag){};//not

c++ - 在基类中是 const 而在派生类中不是 const 的虚函数

谁能解释一下下面代码的输出结果?#include#includeclassAnimal{public:Animal(conststd::string&name):_name(name){}~Animal(){}virtualvoidprintMessage()const{std::coutprintMessage();}输出是Hello,I'mbillandmooHello,I'mbill我不明白为什么。指针animal指向Cow类型的对象。printMessage是一个虚函数。为什么Cow类的实现不是被调用的那个? 最佳答案 Co

C++:继承两个具有相同名称、不同命名空间的基类

如果在不同的命名空间中,是否可以继承两个具有相同名称的基类?顺便说一句,我现在不打算这样做,但我很好奇:classSuperShape:Physics::Shape,Graphics::Shape{//constructorSuperShape(intx,inty,floatcolor):???(x,y),???(color);} 最佳答案 当然可以,为什么不呢?没有什么能阻止你这样做。这是一个工作示例:#include#include#includenamespaceNS1{classMyClass{public:MyClass(