草庐IT

C++:虚拟继承

全部标签

c++ - 在虚拟继承中交换和复制成语的正确方法是什么?

考虑经典的虚拟继承菱形层次结构。我想知道在这种层次结构中copy-and-swap习语的正确实现是什么。example有点人为-而且它不是很聪明-因为它可以很好地处理A、B、D类的默认复制语义。但只是为了说明问题-请忘记示例弱点并提供解决方案。所以我有从2个基类(B,B)派生的类D-每个B类实际上都继承自A类。每个类都有使用copy-and-swap习语的非平凡复制语义。最派生的D类在使用这个习惯用法时有问题。当它调用B和B交换方法时-它交换虚拟基类成员两次-所以A子对象保持不变!!!答:classA{public:A(constchar*s):s(s){}A(constA&o):s(

c++ - 最深类继承中的构造函数参数太多?

我想要一个关于如何避免异常多的构造函数参数的通用解决方案。我在这里提供的例子只是例子,我不想在这里给出具体例子的具体答案。话虽如此,我的问题显然是我的构造函数中的参数太多。我有一个适用于任何类型的人(士兵、巫师、商人等)的基类,称为Person。我的Person类相当简单,它实现了每个人共有的基本功能。假设我有以下属性,我的构造函数为这些属性中的每一个都接受一个参数:stringfirstName字符串姓氏uint健康uintmaxHealth-我们不希望任何人拥有999999999的健康...uintmovementSpeed-并不是每个人都以相同的速度运行,对吧?所以构造函数看起来

c++ - 添加新继承的 "interface"和虚拟方法需要重新编译

现有的答案涵盖了一般情况,但它们有些模糊,我需要确定这一点。考虑:派生自抽象基类“接口(interface)”的现有定义类。类是库的一部分,被编译成多个dll,这些dll通过接口(interface)相互通信。然后添加:第二个“接口(interface)”,定义的类现在将从中派生(因此现在它有两个接口(interface))。由新接口(interface)访问的已定义类的新虚拟方法。我是否需要重新编译链接该库的每个dll,还是只需要重新编译使用新方法的dll?编辑:我的原始接口(interface)公开了一个动态方法,它是Dynamic(intOP,void*args)是否可以添加一个

c++ - 为什么要使用虚拟基类?

根据我的阅读,当你有一个保存数据的抽象基类时使用虚拟基类,所以类不会被复制,但是,如果你不使用虚拟类,复制类有什么问题?是否应该避免保存数据的抽象基类?下面是一个例子:classStorable{public:Storable(conststring&s);virtualvoidread()=0;virtualvoidwrite()=0;virtual~Storable();protected:stringfile_name;//storeinfilenamedsStorable(constStorable&)=delete;Storable&operator=(constStorab

c++ - 使用简短且定义可用的虚拟方法进行优化?

我只是想知道是否大多数编译器都可以进行以下优化classA{virtualvoidf(){m=5;}voidg(){f();}intm;};f()是一个虚函数,因此不是内联的。但是,由于f()的定义简短且可用,编译器能否优化g()以将f()调用为内联? 最佳答案 canthecompileroptimizeg()forcallingf()asinlinesincethedefinitionoff()isshortandavailable?这很复杂。g()可以内联,这样调用A::g()会生成与调用A::f()相同的优化代码.如果您从A

c++ - 多重继承 : Different Address same address

我写了一个示例程序。如果我打印pa和pb的地址都是不同的。你能告诉我为什么会这样吗?#includeusingnamespacestd;classA{intx;};classB{inty;};classC:publicA,publicB{intz;};intmain(){Cc;A*pa;B*pb;pa=&c;pb=&c;cout 最佳答案 作为KerrekSB把它,pa和pb在您的示例中,实际上并不指向c,而是指向A和Bc的子对象.通过多重继承,来自基类的数据本质上是一个接一个地堆叠起来。基类型指针只是偏移到该基类的数据。正因为如此

c++ - 多态(继承)和值类型

我有一堆类型,PixelMeasure,PointMeasure,CentimeterMeasure依此类推,表示带有单位的值。我希望他们有值语义:例如有效不可变,不必担心内存分配,并且多态性:我可以返回类型为Measure的对象并且可以在不知道它是什么具体类型的情况下对其进行操作。我还希望能够放置多个不同的Measure放入容器中。似乎这些在C++中是互斥的。对于多态性,我需要使用指针或引用。我看到两个选项:使用智能指针,例如shared_ptr.这给了我想要的行为(安全,没有原始指针,但多态分派(dispatch))。缺点是:它很冗长(如果我真的想要的话,我可以将它隐藏在typed

【24年2月最新教程】国内如何使用虚拟卡订阅midjourney?midjourney银行卡支付教程?(保姆级图文教程)

1.Midjourney介绍Midjourney是一款备受欢迎的人工智能生成图像工具,它可以通过输入文字描述,自动生成精美的图像。与许多其他图像生成工具不同,Midjourney不需要安装任何软件,也不受个人电脑性能的限制,因为它运行在云端服务器上。要使用Midjourney,只需拥有一个Discord帐号并加入相应的Discord频道即可。2.midjourney如何使用1、科学上网,能登录Midjourney。2、图片准备(最好清晰显示五官的图片)。下面的一个小操作是我为大家展示midjourney的作用,用一张小狗的图片,和一张草原风景图垫图生成新的图片。原图:prompt:https:

c++ - 如果构造函数不是继承的,为什么要调用它们?

代码正在打印所有构造函数。我读到当我们从另一个类派生一个类时,构造函数不会被继承。那么为什么c的创建是从b和a调用构造函数classA{public:A(){cout 最佳答案 当您阅读的文档说构造函数“不被继承”时,这意味着如果类A定义了一个构造函数A::A(intx),那么子类B将不会自动具有采用int的构造函数。但是,仍然需要初始化父类的值;否则,父对象可能处于无效状态。构造函数用于初始化类,因此意味着一个父类的构造函数必须从子构造函数的初始化器列表中调用。如果父类有默认构造函数,则默认调用该构造函数。这就是您在示例中看到的。

c++ - C++中的继承, "...is an ambiguous base of ..."错误

如“TheC++ProgrammingLanguage3.Edition-BjarneStroustrup”中所写。我们可以使用范围解决方案来防止歧义错误。下面的基本程序,当我在类混合中使用3层范围时,会发生错误。但是当我使用2层时没问题。怎么了?还是像设计问题?错误是;deneme.cpp:Inconstructor‘mix::mix(std::__cxx11::string,int)’:deneme.cpp:45:22:error:‘plane’isanambiguousbaseof‘mix’pervaneli::plane::engine=b;我不想制作钻石模型。我对两个基础(平