当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: C++从零开始(十一)中篇 ——类的相关知识 由于篇幅限制,本篇为《C++从零开始(十一)》的中篇,说明多重继承、虚继承和虚函数的实现方式。
 

 

    摘要:前面的文章地址: http://dev.csdn.net/develop/article/26/26246.shtm http://dev.csdn.net/develop/article/26/26480.shtm http://dev.csdn.net/develop/article/26/26481.shtm 这次我们用实例演示datareader的基本应用,当然同时包含command以及c......
    摘要: 今天开始看《101 microsoft visual basic .net applications》。 这本书是很多人集体编写的,带有101个示例程序,涵盖了vb.net编程的大部分方面,主要作者是sean campbell, scott swigart, bob carver等。 书由mspress出版,看了一下,感觉还可以,现在开始写读书笔记吧。 书中提到,书中的程序包含了近700个小时的......


C++从零开始(十一)中篇——类的相关知识
c++从零开始(十一)中篇

    由于篇幅限制,本篇为«c++从零开始(十一)»的中篇,说明多重继承.虚继承与虚函数的实现方式. 【程序编程相关:SQL BUG集之"随机排序中

——类的相关知识 【推荐阅读:Mondrian——有影响的“艺术家”

多重继承

    这里有个有趣的问题,如下:    struct a { long a, b, c; char d; }; struct b : public a { long e, f; };    上面的b::e与b::f映射的偏移是多少?不同的编译器有不同的映射结果,对于派生的实现,c++并没有强行规定.大多数编译器都是让b::e映射的偏移值为16(即a的长度,关于自定义类型的长度可参考«c++从零开始(九)»),b::f映射20.这相当于先把空间留出来排列父类的成员变量,再排列自己的成员变量.但是存在这样的语义——西红柿即是蔬菜又是水果,鲸鱼即是海洋生物又是脯乳动物.即一个实例既是这种类型又是那种类型,对于此,c++提供了多重派生或称多重继承,用“,”间隔各父类,如下:    struct a { long a_a, a_b, c; void abc(); }; struct b { long c, b_b, b_a; void abc(); };    struct ab : public a, public b { long ab, c; void abcd(); };    void a::abc() { a_a = a_b = 10; c = 20; }    void b::abc() { b_a = b_b = 20; c = 10; }    void ab::abcd() { a_a = b_a = 1; a_b = b_b = 2; c = a::c = b::c = 3; }    void main() { ab ab; ab.a_a = 3; ab.b_b = 4; ab.abc(); }    上面的结构ab从结构a与结构b派生而来,即我们可以说ab既是a的实例也是b的实例,并且还是ab的实例.那么在派生ab时,将生成几个映射元素?照前篇的说法,除了ab的类型定义符“{}”中定义的ab::ab与ab::c以外(类型均为long ab::),还要生成继承来的映射元素,各映射元素名字的修饰换成ab::,类型不变,映射的值也不变.因此对于两个父类,则生成8个映射元素(每个类都有4个映射元素),比如其中一个的名字为ab::a_b,类型为long a::,映射的值为4;也有一个名字为ab::b_b,类型为long b::,映射的值依旧为4.注意a::abc与b::abc的名字一样,因此其中两个映射元素的名字都为ab::abc,但类型则一个为void( a:: )()一个为void( b:: )(),映射的地址分别为a::abc与b::abc.同样,就有三个映射元素的名字都为ab::c,类型则分别为long a::.long b::与long ab::,映射的偏移值依次为8.0与28.照前面说的先排列父类的成员变量再排列子类的成员变量,因此类型为long ab::的ab::c映射的值为两个父类的长度之与再加上ab::ab所带来的偏移.    注意问题,上面继承生成的8个映射元素中有两对同名,但不存在任何问题,因为它们的类型不同,而最后编译器将根据它们各自的类型而修改它们的名字以形成符号,这样连接时将不会发生重定义问题,但带来其他问题.ab.abc();一定是ab.ab::abc();的简写,因为ab是ab类型的,但现在由于有两个ab::abc,因此上面直接书写ab.abc将报错,因为无法知道是要哪个ab::abc,这时怎么办?    回想本文上篇提到的公共.保护.私有继承,其中说过,公共就表示外界可以将子类的实例当作父类的实例来看待.
...   下一页

    摘要:会话工厂是nhibernate中的关键类,它与数据库连接、数据库事务等进行交互,还存储着与所有持久对象关联的持久化对象,持久化类是持久化的关键,它实现基本的crud操作。当用户需要持久操作时,由会话工厂创建一个会话供用户进行持久操作。1. 会话工厂的创建会话工厂由isessionfactory接口实现,由configuration的buildsessionfactory方法创建,会话工厂应该使用s......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE