对象的静态类型(static type),就是它在程序中被声明时所采用的类型 对象的动态类型(dynamic type)是指“目前所指对象的类型” vitual 函数是动态绑定而来,调用一个virtual函数时,究竟调用哪一个函数实现,取决于发出调用的那个对象的动态类型 class Shape{ p ...
分类:
编程语言 时间:
2017-04-13 00:16:12
阅读次数:
256
派生类可以继承基类中的private virtual函数 《Effective c++》上说:“derived class可重新定义继承而来的private virtual函数”。这个规则可以用到NVI手法中。“令客户通过public non-virtual成员函数间接调用private virtu ...
分类:
其他好文 时间:
2017-04-06 11:03:16
阅读次数:
261
实验了下面的函数: 输出: 16 为什么是16呢。因为我用的是64位机器呀。 64位机器的指针大小就是8呀。 然后因为对齐,所以整个长度16. 注意了:64位机器里面,int的size还是4. 关于虚函数虚表的内容,3月2号的文章有写。 ...
分类:
编程语言 时间:
2017-03-05 14:32:05
阅读次数:
220
无聊在看《代码整洁之道》,找到了一些自己以前没有注意的地方,在这里记录下来,备忘一下。 目前看完了第九章。 1.重复很多的代码是不好的,需要仔细考虑去掉无用的重复。 2.变量,函数,类等的命名要足够精确,精简&易于搜索。 3.函数尽可能的少用参数(3个以内),&不要向函数内传递bool,因为这明确的 ...
分类:
其他好文 时间:
2017-02-18 19:59:22
阅读次数:
173
在C++中,有四种选择可以替代virtual函数的功能: 1.non-virtual interface(NVI)手法,这是一种template method模式。它以public non-virtual成员函数包含较低访问性的virtual函数。对于子类而言,子类只需重定义私有的virtual函数 ...
分类:
其他好文 时间:
2016-12-25 20:39:48
阅读次数:
193
1.非virtual函数,调用规则取决于对象的显式类型。例如 A* a = new B(); a->display(); 调用的就是A类中定义的display()。和对象本体是B无关系。 2.virtual函数,具体调用哪个版本,取决于虚函数表。例如 A* a = new B(); a->v_dis ...
分类:
编程语言 时间:
2016-12-15 14:10:42
阅读次数:
213
本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有不对的地方请指出。下面都是以VC2008编译器对这两种机制内部实现为例。虚函数以下是百度百科对于虚函数的解释:定义:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数[1]语法:virtual函数返..
分类:
编程语言 时间:
2016-12-11 10:33:05
阅读次数:
220
虚函数的定义: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。 考虑下面两个类: class Base {public: ...
分类:
其他好文 时间:
2016-10-30 16:47:39
阅读次数:
142
3个问题: sizeof一个空类是多大?为什么?编译器为什么这么做? 在这个类中添加一个virtual函数后再sizeof,这时是多大?为什么? 将这个类再virtual继承一个其它的空类,这是多大?为什么? 结论: 1.对象是存在于内存中的实体,编译器必须为其分配内存空间(C++编译器还为每个类默 ...
分类:
其他好文 时间:
2016-10-06 12:56:39
阅读次数:
199
Item 09-绝不在构造函数和析构函数中调用virtual函数(Never call virtual functions during construction or destruction)
Why?
由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行derived class的成员变量尚未初始化。如果期间调用的vir...
分类:
编程语言 时间:
2016-08-07 21:47:34
阅读次数:
217