virtual base classes】的更多相关文章

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 ostr…
#include <iostream> using namespace std; class X { int x, y, z; }; class Y: public virtual X { }; class Z: public virtual X { virtual void f() { } }; class A: public Y, public Z { }; int main() { A *p; cout << "pointer:" << siz…
QT 编译不过的另一个问题: 1. 新建一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler…
Ordinarily, if we do not use a function, we do not need to supply a definition of the function. However, we must define every virtual function, regardless of whether it is used, bacuase compiler has no way to determine whether a virtual function is u…
见代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/01 16:58 from abc import ABCMeta, abstractmethod class SClass(object): __metaclass__ = ABCMeta @abstractmethod def my_print(self): pass class C0Class(SClass): pass class C1Class(SCl…
转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样.而member functions虽然被包含在class的声明之内,但是不出现在Object之中.每一个non-inline function 只会产生一个函数实体.至于inline function则会在每一个调用使用的地方产生一个函数实体(在…
多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何数据,将是最具实用价值的情况. 多重继承的确有正当用途.其中一个情节涉及“public继承某个Interface class"和”private继承某个协助实现的class“的两相组合.…
这种问题比较锻炼思维,同时考察c和c++的掌握程度.如果你遇到过类似问题,此题意义自不必说.如果用c实现c++,主要解决如何实现封装,继承和多态三大问题,本文分两块说. 1.封装 // Example class A contains regular and // static member variables and methods. class A { private: int m_x; static int g_y; int m_z; // Should be invoked when t…
周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,"如何产生一个不能被继承的类",这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一个单例模式,但面试官说,单例模式作为此题的解答不够灵活,后来面试官提示说,可以用友元+虚继承,可以完美实现这样一个类 当然那时我还不太明白,友元与虚继承我都极少接触过,只是知道有这些东西,回头搜了一下"不能被继承的类"的做法,具体如下: 1,声明一个类,CNoHeritance,构造函数为…
1.2. The Java "White Paper" BuzzwordsThe authors of Java have written an influential White Paper that explains their design goals and accomplishments. They also published a shorter summary that is organized along the following 11 buzzwords:1. Si…
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,…
虽然还是菜鸟,但我是一个地地道道的c程序员,甚至一度很讨厌C++(虽然现在也是). 为了在不用C++的情况下学习和使用面向对象而长期奔走,曾经用过一年的Python,后终放弃.之后很长一段时间里摆弄OOC(用c实现面向对象),比如JCOOP,LW_OOPC,GObject...后发现他们的设计异曲同工,使用方法大同小异. 个人比较喜欢这类方法,因为很轻量级,在环境苛刻的嵌入式领域很有用处.但是由于重度强迫症,实在无法接受在“大量需要面向对象”的项目里使用这种蹩脚的方式.于是必须再找一条通路.最后…
More Effective C++ #@author: gr #@date: 2015-05-11 #@email: forgerui@gmail.com 一.仔细区别pointers和references 1.1. 初始化 指针可以不初始化,引用必须初始化为. 引用没有null reference,指针可以设为NULL. //指针初始化为0,NULL,nullptr char *str = 0; int a = 1; //引用必须初始化,int &b;是错误的 int &b = a;…
1.转型其实是一种编译器指令, 大部分情况下它并不改变一个指针所含的真正地址,它只影响"被指出之内存的大小和内容"的解释方式. 2.Global objects的内存保证会在程序启动的时候被清为0, Local objects配置于程序的堆栈中, Heap objects配置于自由空间中, 都不一定会被清为0, 它们的内容将是内存上次被使用后的遗迹. eg. class test {        int a ;        int b ;        int c ; }; tes…
二.详述条件 3 和 4 那么好,我又要问大家了,条件1 和 2比较容易理解.因为member object或 base class 含有copy constructor.那么member object所在的class或者base class的derived class需要合成一个nontrivial copy constructor来调用他的member constructor 或 base class的 copy constructor! 而条件 3 和条件 4比较难理解,我在此阐述一下:…
一.Copy Constructor的构建操作 就像 default constructor 一样,如果class没有申明一个 copy constructor,就会隐含的声明或隐含的定义一个.生成的 copy constructor 也分为 trivial 和 nontrivial 两种.只有 nontrivial 的实体才会被合成于程序之中.决定一个 copy constructor 是否为 trivial 的标准在于class是否展现出所谓的"bitwise copy semantics(…
3.3 Data Member的存取1.   不管什么情况,每一个static data member只有一个实体,放在程序的data segment之中,每次程序取用static member,不管是通过operator::还是member selection operator,都会被内部转化为对该唯一extern实体的直接参考操作.每一个static member的存取以及与class的关联不会导致任何执行时间或空间上的额外负担.如果有两个classes,每一个都声明了一个static me…
前 言 Stanley B.Lippman1.   任何对象模型都需要的三种转换风味: ü        与编译器息息相关的转换 ü        语言语义转换 ü        程序代码和对象模型的转换 2.   C++对象模型的两种解释 ü        语言中直接支持面向对象程序设计的部分 ü        对于各种支持的底层实现机制 3.   C++ class的完整virtual functions在编译时期就固定下来了,程序员没有办法在执行期动态增加或取代其中某一个.这使得虚拟函数调…
A person who is virtuous is also courteous. "有德者必知礼" 书本介绍:<Effective C++:改善程序与设计的55个具体做法>(中文版)(第3版) 一.让自己习惯C++ 1.如今的C++是一个多重范型的编程语言,同时支持过程形式(procedural).面向对象形式(object-oriented).函数形式(functional).泛型形式(generic).元编程形式(metaprogramming): 2.因为或许 …
引例: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; X Y Z A类对象的大小是多少??  1> 没有提供empty virtual base特殊支持的编译器:1 8 8 12 2> 提供了empty virtual base特殊支持的编译器:1 4 4 8       一个class的data members,一般而言,可以表现这个class在程…
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ★将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员 ★tr1::function对象的行为就像一般函数指针.这样的对象可接纳“与给定之目标签名式兼容”的所有可调用物 -----------------------------------…
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:多重继承比单一继承复杂.它可能导致新的歧义性,以及对 virtual 继承的须要 演示样例: class BorrowableItem{ public: void checkOut(); }; class ElectronicGadget{ private: bool checkOut() const; }; class MP3Player: public BorrowableIte…
有三种情况,这将是一个object的内容,以及一class object早期值: class X { ... }; X x; X xx = x;               // 情况1,赋值对象 extern void foo( X x); void bar() { X xx; foo( xx );         // 情况2,作为參数 } X foo_bar() { X xx; return xx;         // 情况3.作为返回值 }   Default Memberwise I…
Data Member的绑定 inline member functin躯体之内的一个data member绑定操作会在整个class声明完成之后才发生. argument list中的名称还是会在它们第一次遭遇时被适当地决议. 为避免错误,早期出现三种防御性代码风格,把data members放在class声明开始处,把inline functions放在class声明之外,把nested type声明放在class的起始处. Data Member的布局 static data member…
Trivial default constructor The default constructor for class T is trivial (i.e. performs no action) if all of the following is true: The constructor is not user-provided (i.e., is implicitly-defined or defaulted) T has no virtual member functions T…
Data 语义学 一个class的data members,一般而言,可以表现这个class在程序执行时的某种状态.Nonstatic data members放置的是"个别的class object"感兴趣的数据,static data members则放置的是"整个class"感兴趣的数据. C++对象模型尽量以空间优化和存取速度优化的考虑来表现nonstatic data members,并且保持和C语言struct数据配置的兼容性.它们把数据直接存放在每一个…
构造.解构.拷贝语意学(Semantics of Construction,Destruction, and Copy) 一般而言,class的data member应该被初始化,并且只在constructor中或是在class的其他member functions中指定初值.其他任何操作都将破坏封装性质,使class的维护和修改更加困难. 纯虚函数的存在(Presence of a Pure Virtual Function) C++ 新手常常很惊讶地发现,一个人竟然可以定义和调用(invok…
执行期语意学(Runtime Semantics) 对象的构造和析构(Object Constructor and Destructor) 一般而言,constructor和destructor的安插都如你所预期: { Point point; //point.Point::Point() 一般而言会被安插在这里 ... //point.Point::~Point() 一般而言会被安插在这里 } 如果一个区段(译注:以{}括起来的区域)或函数中有一个以上的离开点,情况会稍微混乱一些.Destru…
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 6 继承与面向对象设计 Inheritance and Object-Oriented Design 条款32: 确定你的public继承塑模出is-a关系 以C++进行面向对象编程,最重要的一个规则是:public inheritance(公开继承)意味着"is-a"(是一种)的关系.请牢记这个规则! 如果你令class D(Derived…
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,…