C++程序设计模型直接支持三种程序设计范式:程序模型(面向过程的编程),抽象数据类型模型(ADT)
以及面向对象模型(OO)。
在C++中,只有通过指针和引用的间接处理,才支持OO程序设计所需要的多态性质。并且多态只存在于一个个的public class体系中。
多态的主要用途是经由一个共同的接口来影响类型的封装,此接口通常被定义在一个抽象的基类中。
那么C++是如何支持多态的呢?
有三种方式支持多态。
1.经由一组隐式的转化操作,将一个派生类的指针转化为一个指向其public 基类的指针
2.经由虚函数机制。
对于C++中的某些函数,如果基类的派生类需要自定义适合其自身的功能时,则将这些函数定义为虚函数
3.经由dynamic_cast和typeid运算符。
原则上, 被指定的对象的真实类型在每一个特定执行点之前,是无法解析的。(这一点未想明白,why?)
一个类对象在内存中主要由三部分组成:
非静态数据成员的总和的大小
加上任何犹豫alignment的需求而填补上去的空间(这个主要是因为CPU按字节寻址,为了提升效率)
加上为支持virtual而由内部产生的任何额外负担(虚表指针vptr所占内存)
所谓指针其实是指变量地址,在内存中表示为一个32位的无符号数。指针类型是告诉编译器如何解释这个无符号数所代表的的含义,也即这个特定地址中的内存内容及其大小。
例如int *p; 这个p是一个无符号32位整数,也即是一个指针即内存地址,int类型告诉编译器,p这个内存地址存放的是一个int 整数
class *pc; 这个pc是一个无符号32位整数,也代表一个内存地址,class 类型告诉编译器,pc这个内存地址是一个calss对象的起始地址。
所以转换起始是一种编译器指令。转换并不改变指针的大小(也即不该指针所表示的内存地址),转换只是告诉编译器用转换的对象的类型解释指针所指
内存中的内容及大小
以及面向对象模型(OO)。
在C++中,只有通过指针和引用的间接处理,才支持OO程序设计所需要的多态性质。并且多态只存在于一个个的public class体系中。
多态的主要用途是经由一个共同的接口来影响类型的封装,此接口通常被定义在一个抽象的基类中。
那么C++是如何支持多态的呢?
有三种方式支持多态。
1.经由一组隐式的转化操作,将一个派生类的指针转化为一个指向其public 基类的指针
2.经由虚函数机制。
对于C++中的某些函数,如果基类的派生类需要自定义适合其自身的功能时,则将这些函数定义为虚函数
3.经由dynamic_cast和typeid运算符。
原则上, 被指定的对象的真实类型在每一个特定执行点之前,是无法解析的。(这一点未想明白,why?)
一个类对象在内存中主要由三部分组成:
非静态数据成员的总和的大小
加上任何犹豫alignment的需求而填补上去的空间(这个主要是因为CPU按字节寻址,为了提升效率)
加上为支持virtual而由内部产生的任何额外负担(虚表指针vptr所占内存)
所谓指针其实是指变量地址,在内存中表示为一个32位的无符号数。指针类型是告诉编译器如何解释这个无符号数所代表的的含义,也即这个特定地址中的内存内容及其大小。
例如int *p; 这个p是一个无符号32位整数,也即是一个指针即内存地址,int类型告诉编译器,p这个内存地址存放的是一个int 整数
class *pc; 这个pc是一个无符号32位整数,也代表一个内存地址,class 类型告诉编译器,pc这个内存地址是一个calss对象的起始地址。
所以转换起始是一种编译器指令。转换并不改变指针的大小(也即不该指针所表示的内存地址),转换只是告诉编译器用转换的对象的类型解释指针所指
内存中的内容及大小