当前位置: 首页 > wzjs >正文

做网站刷流量挣钱吗做贸易做个外贸网站有必要吗

做网站刷流量挣钱吗,做贸易做个外贸网站有必要吗,编程培训机构招聘,2022年进口博览会上海在C中,菱形继承的内存模型会因是否使用虚继承产生本质差异。我们通过具体示例说明两种场景的区别: 一、普通菱形继承的内存模型 class A { int a; }; class B : public A { int b; }; class C : public A { int c; }; class D : public B, public C { i…

在C++中,菱形继承的内存模型会因是否使用虚继承产生本质差异。我们通过具体示例说明两种场景的区别:


一、普通菱形继承的内存模型

class A { int a; };
class B : public A { int b; };
class C : public A { int c; };
class D : public B, public C { int d; };

内存布局特点:

|-------------------|
| B::A::a (4字节)   |
| B::b (4字节)      |
|-------------------|
| C::A::a (4字节)   |
| C::c (4字节)      |
|-------------------|
| D::d (4字节)      |
|-------------------|

关键问题:

  1. 冗余存储:派生类D包含两份A的成员变量(B::A::a 和 C::A::a)
  2. 访问二义性d.a 需要明确指定路径(d.B::ad.C::a

二、虚继承后的内存模型

class A { int a; };
class B : virtual public A { int b; };
class C : virtual public A { int c; };
class D : public B, public C { int d; };

典型内存布局(以GCC为例):

|-------------------|
| B::vbptr (8字节*) | ➝ 虚基类表,记录A的偏移量
| B::b (4字节)      |
|-------------------|
| C::vbptr (8字节*) | ➝ 同样指向A的偏移量
| C::c (4字节)      |
|-------------------|
| D::d (4字节)      |
|-------------------|
| A::a (4字节)      | ← 唯一一份A的成员
| Padding (4字节)   | (对齐填充)
|-------------------|

核心变化:

  1. 共享基类:虚基类A的成员a在D中只有一份
  2. 间接访问:通过虚基类指针(vbptr)定位共享的A实例
  3. 初始化责任:D的构造函数直接初始化A

三、关键差异对比

特征普通继承虚继承
基类冗余存储存在两份A共享唯一A实例
派生类大小较大(含重复数据)较小但含指针开销
访问基类成员直接访问通过虚基类表间接访问
初始化方式中间类负责初始化最终派生类负责初始化

四、验证示例

#include <iostream>
using namespace std;class A { public: int a; };
class B : virtual public A { public: int b; };
class C : virtual public A { public: int c; };
class D : public B, public C { public: int d; };int main() {D d;d.B::a = 1;  // 虚继承后,修改的是同一份A::ad.C::a = 2;  cout << d.B::a;  // 输出2,证明A是共享的
}

五、注意:在虚继承情况下,虚基类的构造由最底层的派生类直接负责,而不是由中间的基类来构造的。

六、典型应用

在C++标准库中,经典的虚继承解决菱形继承的案例体现在输入输出流(iostream)库的实现中。以下是具体分析:


标准库中的流类继承体系
            basic_ios<...>↑     ↑虚|     ||     |basic_istream<...>  basic_ostream<...>↖       ↗basic_iostream<...>
关键结构解析
  1. **基类 **basic_ios
    所有流类的公共基类,负责管理流的状态(如错误标志、格式化设置等)。
  2. **中间派生类 basic_istream 和 **basic_ostream
    • basic_istream(输入流)通过虚继承派生自 basic_ios
    • basic_ostream(输出流)通过虚继承派生自 basic_ios
  3. **最终派生类 **basic_iostream
    同时继承 basic_istreambasic_ostream,需确保 basic_ios 仅存在一份实例。

虚继承的作用
  • 避免菱形继承的二义性
    basic_istreambasic_ostream 未虚继承 basic_ios,则 basic_iostream 将包含两个独立的 basic_ios 实例,导致访问公共成员(如 good()setf())时出现二义性。
  • 确保单一共享基类
    通过虚继承,basic_iostream 仅保留一个 basic_ios 实例,避免冗余存储和成员冲突。

验证虚继承的示例
#include <iostream>int main() {std::iostream& io = std::cin;  // 合法:std::cin是std::istream&,但向上转型安全io.get();  // 正确调用basic_ios的成员,无二义性return 0;
}
  • 构造顺序
    basic_iostream 的构造函数直接初始化虚基类 basic_ios,确保基类仅构造一次。

标准库实现代码片段(简化)
// 基类
template<typename CharT, typename Traits>
class basic_ios : public ios_base { /*...*/ };// 输入流(虚继承)
template<typename CharT, typename Traits>
class basic_istream : virtual public basic_ios<CharT, Traits> { /*...*/ };// 输出流(虚继承)
template<typename CharT, typename Traits>
class basic_ostream : virtual public basic_ios<CharT, Traits> { /*...*/ };// 最终流
template<typename CharT, typename Traits>
class basic_iostream : public basic_istream<CharT, Traits>,public basic_ostream<CharT, Traits> {
public:// 显式调用虚基类构造函数explicit basic_iostream(/*...*/) : basic_ios<CharT, Traits>(/*...*/),basic_istream<CharT, Traits>(/*...*/),basic_ostream<CharT, Traits>(/*...*/) {}
};

总结

  • 普通菱形继承:基类冗余存储,存在数据冗余和二义性。
  • 虚继承:通过虚基类指针共享唯一基类,牺牲间接访问性能换取空间和语义统一。编译器通过虚基类表(如GCC的vbptr)管理偏移量,确保派生类正确访问共享基类。
  • 最后,尽量不使用菱形继承:
    ● 组合代替继承:将共享功能封装为工具类,通过对象组合调用。
    ● 接口分离:将基类拆分为多个职责单一的接口,避免多重继承。
    ● 依赖注入:通过参数传递依赖对象,而非直接继承。

文章转载自:

http://K8SNJovT.dbrpL.cn
http://rt14s0d6.dbrpL.cn
http://EsjguZCC.dbrpL.cn
http://EZJFDOXU.dbrpL.cn
http://Q9Y7bnkS.dbrpL.cn
http://4BwkXCPz.dbrpL.cn
http://tzTxhHJa.dbrpL.cn
http://MuOBHtmO.dbrpL.cn
http://yK6LjVOx.dbrpL.cn
http://6ZNIo9x9.dbrpL.cn
http://clZ8uHC0.dbrpL.cn
http://39PM7QJz.dbrpL.cn
http://iHEBmr2y.dbrpL.cn
http://eUEfrlpL.dbrpL.cn
http://IOM0AjGL.dbrpL.cn
http://4z98LxN7.dbrpL.cn
http://zVDlzLH5.dbrpL.cn
http://kP2UjiEV.dbrpL.cn
http://xCvT2Xgt.dbrpL.cn
http://XDc0MTNQ.dbrpL.cn
http://wWctTMmM.dbrpL.cn
http://DCu5mPzd.dbrpL.cn
http://ImgCecCL.dbrpL.cn
http://wggtP9gh.dbrpL.cn
http://L4WKP3jl.dbrpL.cn
http://ChXQbOcJ.dbrpL.cn
http://zV1wVSQ2.dbrpL.cn
http://LzwmEIU6.dbrpL.cn
http://hghw4Aut.dbrpL.cn
http://jvTrbZ3q.dbrpL.cn
http://www.dtcms.com/wzjs/653974.html

相关文章:

  • 永久免费自助建站系统网站建设经费保障
  • 服装商务网站建设策划书适合seo优化的网站
  • 做问卷哪个网站好2018网站做外链
  • 太原网站建设开发公司提交百度收录
  • jsp网站制作天津建设工程信息网官网平台
  • 请人做网站注意事项淘宝的网站建设怎么建
  • 英文专业的网站建设织梦dedecms官网
  • 本地网站搭建网站建设的风格
  • 怎么让自己的网站常州做网站包括哪些
  • vip影视建设网站官网网络推广优化工具
  • 领动做的网站怎么样网站建设方面存在的问题
  • 做网站开发没有人带深圳有哪些公司的总部
  • 网站建设石家庄小公司网站建设费用
  • 贵阳网站建设托管注册公司名称查询系统官网
  • 残疾人无障碍网站怎么做丽江网站开发
  • 校园网站设计描述开阿里巴巴网站建设流程
  • 荷塘网站建设在深圳市做一个网站多少钱
  • jq插件网站视频直播app开发公司
  • 建设网站的申请信用卡营销团队外包
  • ftp如何修改网站备案号wordpress花园破解小彬子
  • 中国网站推广黄页名录江苏 建设 招标有限公司网站
  • 设计公司是建筑企业吗想学做网站seo 在哪学 电话多少
  • h5如何做多页面网站外贸必看网站
  • 电子产品网站建设策划书秦皇岛网站建设系统推荐
  • html5 网站开发语言西安市建设工程信息网平台官网
  • 专做动漫的网站功能型网站建设时间
  • 做软测的网站在线域名查询网站
  • 深圳市做物流网站济南腾飞网络网站建设
  • 给期货交易类做网站违法吗怎么把平台推广出去
  • 网站优化seo方案网站开发跟软件开发