考虑代码structBase{};structDerived:publicBase{};structA:publicBase{};structB:publicA,publicBase{};structC:publicA,publicDerived{};//whynoambiguityhere?intmain(){}编译器(g++5.1)警告warning:directbase'Base'inaccessiblein'B'duetoambiguitystructB:publicA,publicBase{};我明白了,Base在B中重复了。为什么C没有警告?C不是同时继承自A和Derive
这个问题在这里已经有了答案:Protecteddatainparentclassnotavailableinchildclass?(4个答案)关闭5年前。谁能给我解释一下为什么(比如,“为什么语言是这样的?”)下面的代码在B::C::bar的第二行有一个编译错误?classA{public:structD{voidcall_foo(A&a){a.foo();}};protected:voidfoo(){}};classB:publicA{structC:publicA::D{voidbar(A&a,B&b){b.foo();//OKa.foo();//Error.Huh?call_fo
我读过一些模糊的声明virtualinheritance没有提供COM需要的内存结构,所以我们只好使用普通的继承。发明虚拟继承是为了解决菱形继承(钻石问题)。有人可以向我展示这两种继承方法之间内存结构细节差异的图示吗?以及虚拟继承不适合COM的关键原因。最好有照片。非常感谢。 最佳答案 首先,在COM中总是使用虚拟继承的行为。QueryInterface无法返回不同的值,例如IUnknown基指针取决于用于获取它的派生类。但是您是对的,这与C++中的虚拟继承机制不同。C++不使用QueryInterface函数进行向上转换,因此它需
我想要一些关于在这种情况下比较指针时的最佳实践的信息:classBase{};classDerived:publicBase{};Derived*d=newDerived;Base*b=dynamic_cast(d);//WhencomparingthetwopointersshouldIcastthem//tothesametypeordoesitnotevenmatter?booltheSame=b==d;//Or,booltheSame=dynamic_cast(b)==d? 最佳答案 如果你想比较任意类层次结构,安全的做法是
我曾经读过一个关于dynamic_cast问题的答案。dynamic_cast无法工作,因为基类没有虚方法。其中一个答案说,从没有虚方法的类派生通常意味着糟糕的设计。这个对吗?即使不利用多态性,我仍然看不出这样做有什么错误。 最佳答案 这取决于我们在谈论什么:对于Traits类(无数据)没问题(想到了std::unary_function)对于private继承(用于代替组合以从空基优化中受益)也很好当您开始以多态方式处理此类Derived对象时,问题就出现了。如果您达到了这样的位置,那肯定是代码味道。注意:即使上面提到的很好,您仍
在类层次结构的设计中,我使用了一个抽象基类,它声明了派生类将实现的各种方法。从某种意义上说,基类与C++中的接口(interface)一样接近。但是,有一个特定的问题。考虑下面声明我们的接口(interface)类的代码:classInterface{public:virtualInterfacemethod()=0;};classImplementation:publicInterface{public:virtualImplementationmethod(){/*...*/}};当然,这不会编译,因为您不能在C++中返回抽象类。为了解决这个问题,我使用了以下解决方案:templa
我是C++的新手,这是我遇到的问题:我有两个类,Client和Host。加载所有内容后,您可以选择按下两个按钮,如果按下按钮1,则加载Client,如果按下按钮2,则加载Host。现在Client和Host都是相当大的类,我不想把它们都放到内存中。所以我的想法是创建一个Base类,然后Client和Host都应该扩展基类,然后我唯一要做的就是这样做是这样的:Baseconnection;//Ifbutton1ispressed:connection=Client();//Ifbutton2ispressed:connection=Host();好吧,这听起来好得令人难以置信,而且当我尝
我有一个基类和一个扩展它的子类。子类内部有自己的方法,父类没有。也就是说,在基类中将其声明为虚拟并不是一个真正的选择。classA{public:virtualvoidhelloWorld();};classB:publicA{public:virtualvoidhelloWorld();voidmyNewMethod();};然后,在我的实现中,我有一个指向A的指针,并将其构造为B://somewhereina.cppfileA*x;x=newB();x->myNewMethod();//doesn'twork我目前的解决方案是转换它:((B*)x)->myNewMethod();我
我需要有关使用接口(interface)的多重继承的实现的帮助...有一个现有的代码和一个具有很多功能的接口(interface)。这些实例是使用工厂创建的。classIBig{//Lotofpurevirtualfunctions};他的实现:classCBig:publicIBig{//Implementation}我想将界面拆分为多个较小的界面,但它应该在一段时间内与现有代码保持兼容。这是我尝试做的示例:classIBaseA{public:virtualvoidDoA()=0;};classIBaseB{public:virtualvoidDoB()=0;};//Thesame
执行以下操作是否安全或者是否是未定义的行为:classBase{private:inta;};classDerived:publicBase{private:intb;};Basex;Derivedy;x=y;//safe?派生类中的额外位是否被切掉了? 最佳答案 是的,切片发生了。不过,这不是未定义的行为。您可能会发现C++-FAQ中的此条目很有帮助:http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8