草庐IT

Inheritance

全部标签

C++ 隐式和显式继承构造函数调用

我有一个关于对基本构造函数的隐式和显式调用的问题。如果我们有这样的类层次结构:classPerson{protected:std::stringm_name;public:Person(std::string&_name):m_name(_name){std::cout根据我的讲义,主要是对'Baby'的调用,如下所示:std::stringbabyname="Robert";intnappies=5;Babybaby(babyname,nappies);导致以下情况发生:当在Baby的初始化列表中对Person进行显式调用时:Baby的初始化列表被调用,no_of_nappies被初

C++虚方法的虚继承

structA{virtualvoidfoo(){std::cout所以这个在编译时给了我们以下错误:\main.cpp:16:8:error:nouniquefinaloverriderfor'virtualvoidA::foo()'in'D'structD:publicB,publicC{如果我们让B和C结构的继承成为非虚拟的,代码正在编译就没有任何错误(当然,如果我们调用dd.foo()).那么有什么区别呢?为什么我们虚拟继承我们的类会出错,而直接继承却不会出错? 最佳答案 使A成为B和C的虚拟基类确保D恰好包含一个A子对象[

c++ - 使用 "irrelevant"方法的继承类设计

假设我有以下抽象基类:classDLAContainer{public:DLAContainer(){std::random_devicerd;mt_eng=std::mt19937(rd());}virtualvoidgenerate(std::size_t_n)=0;protected:std::mt19937mt_eng;virtualvoidspawn_particle(int&_x,int&_y,std::uniform_real_distribution&_dist)=0;virtualvoidspawn_particle(int&_x,int&_y,int&_z,std:

c++ - 继承函数返回派生类,而不是基类

在C++中是否可以在Base类中制定返回Base类型的函数,以便在Derived类中,它们返回Derived类型,而不重载?最小的例子:classBase{public:Base(doublev){value=v;}Baseadd(Baseb){returnBase(b.value+this->value);}voidprint(){std::cout动机在实际例子中,Base代表一个线性代数矩阵,Derived代表一个vector。矩阵提供了许多适用于vector的函数,例如标量的加法或乘法。在这种情况下,最好不必手动覆盖所有这些矩阵函数来返回vector。如果可能的话,我想表达无论

c++ - 基类的派生类充当抽象类

我定义了一个父类(superclass)元素。有一些element的派生类,比如triangle,quad和cube。一些element对象是边界元素。如果element是边界元素,那么我必须定义额外的数据成员和函数。如果element类不是基类,我可以很容易地派生一个boundary_element类。(我的意思是,如果triangle,quad和cube是单独的类我可以定义单独的派生类,如boundary_triangle、boundary_quad和boundary_cube).所以我的问题是我必须定义一个子类boundary_element,它必须是定义派生类boundary_

c++ - 常量和非常量版本和继承

在我的问题中,我将有几个共享getter和setter的类(在我的例子中,operator())。假设我有以下内容classBase{public:int&operator()(){returnvalue;}intoperator()()const{returnvalue;}protected:intvalue;};classDerived:publicBase{public:intoperator()()const{returnvalue;}};我希望能够做这样的事情:Derivedd;d()=1;但是编译器提示说表达式不可赋值。然而,这样做Derivedd;d.Base::oper

c++ - 为什么覆盖虚函数时不考虑访问限定符?

以下代码打印“I'mB!”。这有点奇怪,因为B::foo()是私有(private)的。关于A*ptr,我们可以说它的静态类型是A(foo是public),它的动态类型是B(foo是私有(private)的)。所以我可以通过指向A的指针调用foo。但是这样我就可以访问B中的私有(private)函数。可以算作封装违规吗?由于访问限定符不是类方法签名的一部分,因此会导致这种奇怪的情况。为什么在覆盖虚函数时不考虑C++中的访问限定符?我可以禁止这种情况吗?这个决定背后的设计原则是什么?Liveexample.#includeclassA{public:virtualvoidfoo(){st

c++ - 以不止一种方式向上转换为作为基类的 C++ 类(无需使用虚拟继承)

classA{};classB:publicA{};classC:publicA,publicB{};intmain(){Cc;A*pA=static_cast(&c);}在上面的代码中,类C是从类A派生而来的,有两种不同的路径:1.直接来自A2.间接通过B即A因此,当我将类C的对象转换为指向类A的指针时,Linux上的g++会报告以下错误:错误:A是C的不明确基数我也通过删除静态转换来尝试相同的代码,如下所示:A*pA=&c;但是,我仍然得到完全相同的错误。有什么解决办法吗?顺便说一句,在使用VisualC++编译器的Windows上同样可以正常工作而不会出错。我知道虚拟继承可以解决

c++ - 我可以将 BOOST_FUSION_ADAPT_STRUCT 与继承的东西一起使用吗?

假设我有structcat{inttail;inthead;};structbird{intwing;intbursa;};如果我这样做...structwat:publiccat,publicbird{};BOOST_FUSION_ADAPT_STRUCT(cat,tail,head)BOOST_FUSION_ADAPT_STRUCT(bird,wing,bursa)BOOST_FUSION_ADAPT_STRUCT(wat,wat::cat,wat::bird)...我无法获得构建,但如果我像下面这样显式引用继承的对象,它是完全有效的。#include#includenamespa

c++ - 没有虚拟继承的奇怪行为

这个问题在这里已经有了答案:multipleinheritance:unexpectedresultaftercastfromvoid*to2ndbaseclass(3个答案)关闭5年前。我正在处理一段表现出非常奇怪行为的代码。我设法在一个简单的helloworld风格的程序中复制了它,代码如下:#includeusingnamespacestd;classTest{public:virtual~Test()=default;protected:virtualvoidSetUp(){}};classICallbackReceiver{public:virtual~ICallbackRe