virtual base classes用来实现菱形继承解决多个重复subobject的问题

//: C09:VirtualBase.cpp
// Shows a shared subobject via a virtual base.
#include <iostream>
using namespace std; class Top
{
protected:
int x;
public:
Top(int n)
{
x = n;
}
virtual ~Top() {}
friend ostream&
operator<<(ostream& os, const Top& t)
{
return os << t.x;
}
}; class Left : virtual public Top
{
protected:
int y;
public:
Left(int m, int n) : Top(m)
{
y = n;
}
}; class Right : virtual public Top
{
protected:
int z;
public:
Right(int m, int n) : Top(m)
{
z = n;
}
}; class Bottom : public Left, public Right
{
int w;
public:
Bottom(int i, int j, int k, int m)
: Top(i), Left(0, j), Right(0, k)
{
w = m;
} friend ostream&
operator<<(ostream& os, const Bottom& b)
{
return os << b.x << ',' << b.y << ',' << b.z
<< ',' << b.w;
}
}; int main()
{
Bottom b(1, 2, 3, 4);
cout << sizeof b << endl;
cout << b << endl;
cout << static_cast<void*>(&b) << endl;
Top* p = static_cast<Top*>(&b);
cout << *p << endl;
cout << static_cast<void*>(p) << endl;
cout << dynamic_cast<void*>(p) << endl; return 0;
} ///:~

输出结果:

28
1,2,3,4
0043FABC
1
0043FAD0
0043FABC

对象大小与实现有关,28 = 4 * 4 + 2 * 4 + 1 * 4(大概是4个int,2个ptr to virtual base,1 个vptr)

注意Bottom里初始化Top的方式,Left、Right给出的对应参数会被编译器巧妙地忽略

内容源自:《TICPP-2nd-ed-Vol-two》

virtual base classes的更多相关文章

  1. vptr, vtable, virtual base class table

    #include <iostream> using namespace std; class X { int x, y, z; }; class Y: public virtual X { ...

  2. cannot convert from pointer to base class 'QObject' to pointer to derived class 'subClass' via virtual base 'baseClass'

    QT 编译不过的另一个问题: 1. 新建一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following ...

  3. [C++] OOP - Virtual Functions and Abstract Base Classes

    Ordinarily, if we do not use a function, we do not need to supply a definition of the function. Howe ...

  4. python 用abc模块构建抽象基类Abstract Base Classes

    见代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/01 16:58 from abc import ABCMet ...

  5. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...

  6. Effective C++ -----条款40:明智而审慎地使用多重继承

    多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...

  7. c语言实现面向对象OOC

    这种问题比较锻炼思维,同时考察c和c++的掌握程度.如果你遇到过类似问题,此题意义自不必说.如果用c实现c++,主要解决如何实现封装,继承和多态三大问题,本文分两块说. 1.封装 // Example ...

  8. C++的黑科技

    周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,"如何产生一个不能被继承的类",这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一 ...

  9. Core Java Volume I — 1.2. The Java "White Paper" Buzzwords

    1.2. The Java "White Paper" BuzzwordsThe authors of Java have written an influential White ...

随机推荐

  1. Kudu版本升级(官网推荐的步骤)(Upgrade from a Previous Version of Kudu)

    不多说,直接上干货! http://kudu.apache.org/docs/installation.html#sles_from_source

  2. PHP+jQuery实现翻板抽奖(中奖概率算法)

    在电视节目中有一种抽奖形式暂且叫做翻板抽奖,台上有一个墙面,墙面放置几个大方块,主持人或者抽奖者翻开对应的方块即可揭晓中奖结果.类似的抽奖形式还可以应用在WEB中,本文将使用PHP+jQuery为您讲 ...

  3. 修改mysql表的字符集

    ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 修改数据库字符集: 代码如下: ALTER DAT ...

  4. Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法

    总是被这些相似的概念搞晕,查阅了资料后做个小总结,以变量为例,方法辨析类似. 1.多胞胎名字汇总辨析 成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称, ...

  5. Spring课程 Spring入门篇 2-1 IOC和bean容器

    课程链接: 本节讲了5部分内容,6为项目demo: 1 接口及面向接口编程 2 什么是IOC 3 Spring的bean配置 4 Bean的初始化 5 Demo 自己理解: 1 高层模块和底层模块都依 ...

  6. maven课程 项目管理利器-maven 2-2第一个maven案例hellomaven

    maven 目录结构 pom.xml src -main -java -package -test -java -package -resources

  7. springmvc源码分析上之HandlerMapping

    现在企业开发中,必不可少的管理框架就是spring,而与之搭配的也是企业开发中用的最多的MVC框架:Springmvc 关于springmvc原理,请自行百度 HandlerMapping是sprin ...

  8. yield关键字的使用

    yield的中文是什么意思呢? 在金山词霸上面的翻译是: vt.屈服,投降: 生产: 获利: 不再反对 vi.放弃,屈服: 生利: 退让,退位 n.产量,产额: 投资的收益: 屈服,击穿: 产品 个人 ...

  9. css的三个特性 背景透明设置

    关于行内元素(补充一点) 行内元素只能容纳文本或其他行内元素.(a特殊a里面可以放块级元素) 例子: 关于行高tip: 选择器的嵌套层级不应大于3级,位置靠后的限定条件应尽可能的精确. 属性定义必须另 ...

  10. The seventeenth day

    A good book is a good friend 好书如挚友