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…
这种问题比较锻炼思维,同时考察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…
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…
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…
前 言 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在程…
有三种情况,这将是一个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…