专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅
用词约定 “思路方法签名”包括返回类型、思路方法名、参数列表这 3者共同标识了个思路方法 “声明思路方法”即指出该思路方法签名“定义思路方法”则是指定思路方法时执行代码 “同名思路方法”是指思路方法签名相同两个思路方法 “重写”个思路方法意味着子类想继承父类对思路方法声明却想重新定义该思路方法 单独使用“使用”词时包括& [阅读全文] [PDF]
C中虚作用主要是实现了多态机制有关多态简而言的就是用父类型别指针指向其子类例子然后通过父类指针实际子类成员这种技术可以让父类指针有“多种形态”这是种泛型技术所谓泛型技术说白了就是试图使用不变代码来实现可变算法比如:模板技术RTTI技术虚技术要么是试图做到在编译时决议要么试图做到运行时决议 有关虚使用思路方法我在这里不做过多阐述大家可以看看相关C书籍在这篇文章中我只想从虚实现机制上面为大家个清晰剖析 当然相同文章在网上也出现过些了但我总感觉 [阅读全文] [PDF]
在我前篇文章\"透过汇编另眼看世界的\"中我们通过汇编了解了虚全部过程在本文中我将分析多继承情况下虚情况 首先还是写些简单代码作为本文分析例子代码: \" align=top>//theabstractbaseIBase...{\" align=top>public:\" align=top>virtualvoidfunc1=0;\" align=top>virtualvoidfunc2=0;\" align=top>};\" align=top>IDe [阅读全文] [PDF]
用词约定 “思路方法签名”包括返回类型、思路方法名、参数列表这 3者共同标识了个思路方法 “声明思路方法”即指出该思路方法签名“定义思路方法”则是指定思路方法时执行代码 “同名思路方法”是指思路方法签名相同两个思路方法 “重写”个思路方法意味着子类想继承父类对思路方法声明却想重新定义该思路方法 单独使用“使用”词时包括&l [阅读全文] [PDF]
虚函数联系到多态,多态联系到继承。所以本文中都是在继承层次上做文章。没了继承,什么都没得谈。 下面是对C++的虚函数这玩意儿的理解。 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码 class A{ public: void print(){ cout<<”This is [阅读全文] [PDF]
.简介 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次: class A { public: virtual void foo() { cout << "A::foo() is called" << endl;} }; class B: public A { public: virtual void foo() { cout << "B::foo() is called" << endl;} [阅读全文] [PDF]
.java中有虚函数,但是没指针,那也许会有这样的问题,那java是怎么实现多态的?java中可以肯定是有虚函数的,而且我们如果不申明为final形他默认就是虚函数.不用vitual申明. "In Java, you do not need to declare a method as virtual. Dynamic binding is the default behavior. If you do not want a method to be virtual, you tag it as final"--from <core java2 :volum I> [阅读全文] [PDF]
在C子类中定义某成员时我们通常需要显式其基类版本例如在个绘图类结构中子类只需要去绘制在子类添加进去部分图形然后再基类去完成基础图形这个成员有般都是虚对于构造在子类构造中也可能显式地执行基类构造 先看看个例子基类Shape默认构造不分配name空间但子类Line默认构造会按照规则自动产生name这里我们假设name是private如果name不是private问题会很简单也不会出现下述问题了但在现实中通常在基类构造会初使化些重要private成员或者构造比较长在子类 [阅读全文] [PDF]
虚函数和多态性使得设计和实现易于扩展的系统成为可能。在程序开发过程中,不论类是否已经建立,程序员都可以利用虚函数和多态性先编写这些类对象的程序。 虚函数和多态性的程序设计无需使用switch逻辑。程序员可以用虚函数机制自动完成等价的逻辑,因而避免与switch逻辑有关的各种各样的错误。 虚函数的声明方法是在基类的函数原型前加上关键字virtual。 派生类在需要的时候可以自己实现基类的虚函数,否则就使用基类的实现。 如果用名字和圆点成员选择运算符引用一个特定的对象来调用虚函数,则被调用虚函数是在编译时确定(称为静态联编),也就是为该特定对象的类定义的函数或 [阅读全文] [PDF]
假定一组形状类(如Circle、Triangle、Rectangle和Square等等)都是从基类Shape派生出来的。在面向对象的程序设计中,我们可能要使每一个这样的类都能够绘制其自身形状。尽管每个类都有它自己的draw函数,但是绘制每种形状的draw函数却是大不相同的。当需要绘制形状时,不管它是什么形状,把它作为基类Shape的对象处理是再好不过了。然后,我们只需要简单地调用基类Shape的函数draw,并让程序动态地确定(即在执行时确定)使用哪个派生类的draw函数。 为了使这种行为可行,我们把基类中的函数draw声明为虚函数。然后在每个派生类中重新 [阅读全文] [PDF]
如果基类声明了一个函数是虚函数,而且派生类并没有改变参数,只是把函数内容改变了,那么这个可以认为是“重写“ 派生类重载是什么呢,就是在派生类中仅仅保留基类的函数名,参数变了,或者返回类型也变了,如果不改变参数仅仅改变返回类型不是重载,这样也是错的。 如果重载了,你就不会得到基类对应的函数名的函数了,被隐藏了! 除非你使用基类作用域解析符号,要不你调用基类版本就是错误的! 看例子: class C0 { public: virtual void Set1(int i) { cout <<\"C0:Set1 i=\" <<i <& [阅读全文] [PDF]
C中以类、虚等为代表数据抽象功能直是C核心和难点我认为C抽象应该是指:从我们需要解决问题出发在和该问题相关组关联对象中提取出主要或共有部分――说简单点就是用相同行为来操作区别对象 从提出问题到找出和该问题相关对象这是个互动、反复过程在对相关对象抽象中随着认识深入我们可能会修改最初目标而最初目标修改又可能使组新相关对象被加入进来如:假设现在要设计个基于广域网邮件服务器首先可能需要通过对底层协议进行封装为高层pop3、smtp协议提供组标准接口开始为了使问题简化我们可 [阅读全文] [PDF]
以下代码没有什么实用价值,最多拿来加深一下对虚函数表的印象,一时性起,想直接操纵虚函数表。这段代码只尝试了在VS2005上编译通过,没有在其他编译器上尝试,它并不具有可移植性。 大家都知道C++的虚函数机制通常是通过一个虚函数表来实现的,C++不对内存访问做限制,所以我们可以通过指针自己访问虚函数表,然后进行操作。 #include<iostream> usingnamespacestd; classB { public: virtualvoidfun1() { cout<<\"B::fun1\"<<end [阅读全文] [PDF]
考虑下多线程代码在设计上App为了获取更多功能从Window派生而App同时为了获取 某个模块回调(所谓Listener)App同时派生Listener并将自己指针交给另个模块 另个模块通过该指针多态回调到App实现(对Listener规定接口implemention)设计上 只是个很简单Listener回调在单线程模式下切都很正常(后面我会罗列代码)但是换到 多线程下编译器似乎就对语言机制支持不够了: /**//// /// to demonstrate the [阅读全文] [PDF]
学习 C 同志不知道有没有和我样遇到过这样困惑:C中虚到底如何实现?在各种继承关系中虚表结构到底是什么样?曾经我是很想当然可是后来在使用ATL过程中我发现并不是我想那样大家知道利用C语言本身特性进行COM编程当然是很方便事但是你就得随时随地都知道那虚表里头到底是些什么东西讲C语法书没有义务告诉你C产生虚表是什么样,这就是头痛所在 自已做试验是件很快乐事我很愿意这么做 首先写个作为我们实验基础传入虚表指针显示虚数表内容 void DispVFT(DWORD* [阅读全文] [PDF]
什么是虚(如果不知道虚为何物但有急切想知道那你就应该从这里开始)简单地说那些被virtual关键字修饰成员就是虚虚作用用专业术语来解释就是实现多态性(Polymorphism)多态性是将接口和实现进行分离;用形象语言来解释就是实现以共同思路方法但因个体差异而采用区别策略下面来看段简单代码 A{public:void pr{ cout<<”This is A”<<endl;}}; B:public A{public:void pr{ cout [阅读全文] [PDF]
问:为什么要把父类的析构函数定义成虚函数,,www. ?答:否则子类的析构函数可以未被调用,具体代码如下:class A {public:A(){TRACE(\"A()\\n\");};~A(){TRACE(\"~A()\\n\");};}; class B : public A {public:B(){TRACE(\"B()\\n\");};~B(){TRACE(\"~B()\\n\");};}; void CEgDlg::OnButton1() {A * p = (A*)new B() ;delete p ;}运行结果如下:A()B()~A() [阅读全文] [PDF]
首先来说一说虚函数,所谓虚函数是这样一个概念:基类中有这么一些函数,这些函数允许在派生类中其实现可以和基类的不一样。在C++中用关键字virtual来表示一个函数是虚函数。 C++中还有一个术语“覆盖”与虚函数关系密切。所谓覆盖就是说,派生类中的一个函数的声明,与基类中某一个函数的声明一模一样,包括返回值,函数名,参数个数,参数类型,参数次序都不能有差异。(注1)说覆盖和虚函数关系密切的原因有两个:一个原因是,只有覆盖基类的虚函数才是安全的。第二个原因是,要想实现基于虚函数的多态就必须在派生类中覆盖基类的虚函数。 接下来让我们说一说为什么要有虚函数,分析一下为什么派 [阅读全文] [PDF]
对C 了解人都应该知道虚(Virtual Function)是通过张虚表(Virtual Table)来实现简称为V-Table在这个表中主是要个类虚地址表这张表解决了继承、重载问题保证其容真实反应实际这样在有虚类例子中这个表被分配在了这个例子内存中所以当我们用父类指针来操作个子类时候这张虚表就显得由为重要了它就像个地图样指明了实际所应该 这里我们着重看下这张虚表在C标准规格介绍说明书中说到编译器必需要保证虚表指针存在于对象例子中最前面位置(这是为了保证正确 [阅读全文] [PDF]
重载父类虚是很显然事情不然虚就变得毫无意义下面我们来看下如果子类中有虚重载了父类虚会是个什么样子?假设我们有下面这样个继承关系 为了让大家看到被继承过后效果在这个类设计中我只重载了父类个:f那么对于派生类例子其虚表会是下面个样子: 我们从表中可以看到下面几点 1)重载f被放到了虚表中原来父类虚位置 2)没有被重载依旧 这样我们就可以看到对于下面这样 Base *b = Derive; [阅读全文] [PDF]
1 2 > 共22条 分2页