C++中重载与重写函数区别及虚函数

合集下载

函数重载和虚函数的区别

函数重载和虚函数的区别

函数重载和虚函数的区别
函数重载和虚函数都是C++中常用的特性,但是它们有着不同的用途和实现方式。

在本文中,我们将探讨函数重载和虚函数的区别。

函数重载是指在同一作用域内声明多个函数,并且它们具有相同的名称但是不同的参数列表。

这样就可以根据不同的参数类型和数量来调用不同的函数。

函数重载可以提高代码的可读性和可维护性。

而虚函数是指在基类中声明的函数,在派生类中可以被重写。

在调用一个指向派生类对象的基类指针或引用时,会根据实际对象类型来确定调用的函数。

通过虚函数,可以实现多态性。

因此,函数重载和虚函数的主要区别在于它们的实现方式和用途。

函数重载用于在同一作用域内定义多个函数,而虚函数用于实现多态性。

同时,函数重载是在编译时确定调用的函数,而虚函数是在运行时确定调用的函数。

需要注意的是,虚函数和函数重载可以同时使用,即在派生类中重载基类的虚函数。

这样可以根据不同的参数类型和数量来实现不同的功能。

总的来说,函数重载和虚函数都是C++中非常有用的特性,它们可以提高代码的可读性和可维护性,并且可以实现多态性。

但是需要根据具体的情况选择使用哪种特性。

- 1 -。

c语言函数重载

c语言函数重载

c语言函数重载C语言是一种广受欢迎的计算机语言,以简单易学及其灵活的特性著称。

它不仅是一种编程语言,还是一种编程范式,用于更好地完成计算机程序的设计和开发。

在计算机程序设计和开发中,函数重载是一个灵活的方法,它可以有效地显示代码的可读性和可扩展性。

本文将介绍C语言函数重载的一般概念,并介绍如何使用它来提高代码可读性和可扩展性。

首先,让我们了解一下什么是函数重载。

函数重载是指在C语言中,允许不同参数引用同一个函数名称,而函数实现不同。

函数名称相同,但参数类型不同,就可以实现函数重载,这样可以提高代码的可读性和可扩展性。

函数重载的主要优势是提高代码的可读性和可扩展性。

由于函数的名称是唯一的,使用者可以更容易地理解函数的功能。

同时,使用者也可以更容易地添加新功能,而不必改变已经存在的函数,提高代码的可扩展性和可维护性。

函数重载还可以提高代码的可重复使用性。

如果两个函数做类似的功能,可以使用函数重载,用一个函数名称,实现不同功能,这样可以大大减少代码量,提高代码的可重复使用性。

函数重载也可以在多个不同的程序中使用,即跨程序函数重载。

函数可以在两个或多个不同的程序中被重载,共享相同的函数名称,这样,可以提高代码的可复用性,以及改进程序可维护性和可扩展性。

函数重载有其局限性。

首先,函数重载只能用于相同参数列表的函数,也就是说,函数重载不能用于不同参数列表的函数。

其次,函数重载只能用于同一个文件中的函数,跨文件的函数重载是不允许的。

最后,只有当参数列表不同时,函数重载才是有效的,如果参数列表相同的函数重载是无效的。

总而言之,C语言函数重载是一种灵活的编程范式,可以显示代码的可读性和可扩展性。

它有很多优势,如提高代码可读性、可重复使用性、可扩展性和可维护性等,但也有一些局限性。

C--程序设计--第10章-多态性及虚函数

C--程序设计--第10章-多态性及虚函数

使用重载函数注意:
不要使用重载函数描述不相干的函数 在类中,构造函数和普通成员函数均可以
重载 避免与函数的默认参数产生二义性
二、运算符重载
运算符重载(operate overloading)就是 赋予已有的运算符多重含义。
运算符重载实质是函数重载,运算符重载 的选择与函数重载类似,会根据运算符的 操作数的类型、个数和顺序来进行运算符 函数的选择。
#include<iostream.h> str#iinngc:l:usdter<isntgr(icnhga.rh>*s) v{}ossccsssc{s{{ittohtttolsstlsssls*drruarrrueptrepttepsi1trii3tc{pn=rin=rrn=pmn.<nn.<lprgncngncign=agp<*ggp<auitepgtepnte'irssrssbv\hwy:hwyghwnsit1ssitsla0=(:=(:=(tnr=ttnrit'scssscs:sc)rt1"rrt3scesss~ivci;thpt1hpsih1(.T23(.t::tttsnohn}ra,r.a,tza()gh(()grrrrttiatlrsilrsrer";eass;eiiiirdre[)ne[1i;[Ttt1ttnnnniglnl;gnl.nlhl)rlggggnep*e(e}(gesgeiei;2e(((gtrsnsnstnp(nsns)ncsi(lipg)gthg)ig(;(htn)en;t;tr;t;nti)a)artnthhih}ths<<ri{((;+n++<p<snd))}1g1s1aere*ige;]]i]nonszl{{;&;z;ddgd)&eercseelrl;s=teo1)m;a;/18etu)om/)0ut..;)构sr<""/;pn<造);//;s;/复}lp函构e<制n<数造ge构tn函hd造;l数};重} 载

c语言重定义函数

c语言重定义函数

如何获得新知识英语作文Expanding the Horizons of Knowledge: Strategies for Acquiring New Information.In an era characterized by rapid technological advancements and a deluge of information, the pursuit of knowledge has become increasingly essential for personal growth and societal progress. Acquiring new knowledge empowers us to navigate the complexities of the modern world, make informed decisions, and contribute meaningfully to our communities. However, the sheer volume of information available today can be overwhelming, andfinding effective strategies to filter and absorb knowledge can be a challenge.1. Active Reading and Critical Thinking:Engaging in active reading involves more than simply glancing over a text; it requires actively interrogating the material, questioning its assumptions, and seekingconnections with existing knowledge. Critical thinking skills enable us to analyze, evaluate, and synthesize information, separating facts from opinions and identifying biases. By questioning the author's purpose, evidence, and reasoning, we develop a deeper understanding of the subject matter.2. Immersive Learning Experiences:Immersive learning experiences provide opportunities to engage with knowledge in a tangible and interactive way. These experiences can take various forms, such as attending lectures, participating in workshops, conducting research, or engaging in hands-on activities. By immersing ourselves in the learning environment, we enhance retention andfoster a deeper connection with the material.3. Seek Out Diverse Perspectives:Exposing ourselves to multiple perspectives enriches our understanding by providing us with a broader context and challenging our existing beliefs. Reading from diversesources, including books, articles, podcasts, and online forums, allows us to consider different viewpoints and gain a more comprehensive picture of the topic. Engaging in respectful discussions with individuals from different backgrounds also promotes intellectual growth.4. Leverage Technology for Learning:Technology has opened up numerous avenues for knowledge acquisition. Online learning platforms, educational apps, and virtual reality simulations provide convenient and interactive ways to explore new subjects. These tools often offer personalized learning experiences tailored to individual interests and learning styles, enabling us to learn at our own pace and delve into areas that spark our curiosity.5. Practice Active Recall and Spaced Repetition:Active recall involves regularly testing our knowledge through methods such as flashcards, quizzes, or teaching the material to others. This process strengthens memory byforcing us to retrieve information from long-term storage. Spaced repetition involves reviewing previously learned material at increasing intervals, which helps to solidify knowledge and prevent forgetting.6. Set Learning Goals and Track Progress:Defining specific learning goals provides direction and motivation for knowledge acquisition. By setting clear objectives, we can prioritize our efforts and track our progress. Regular self-assessment helps us identify areas where further learning is needed and provides a sense of accomplishment as we achieve our goals.7. Engage in Meaningful Connections:Connecting new knowledge to existing experiences and knowledge structures helps to make it more personally relevant and memorable. By reflecting on how the new information relates to our personal values, beliefs, and past experiences, we create meaningful associations that enhance retention.8. Foster a Growth Mindset:Adopting a growth mindset, where we embrace challenges and view mistakes as opportunities for learning, is essential for continuous knowledge acquisition. By believing that our abilities can be developed through effort and persistence, we cultivate a lifelong love of learning.9. Find a Knowledge Partner or Mentor:Learning alongside a knowledge partner or mentor can provide valuable guidance and support. Sharing ideas, challenging each other's perspectives, and holding ourselves accountable for our learning progress can accelerate knowledge acquisition and foster a sense of community.10. Engage in Real-World Applications:Applying new knowledge to real-world situations notonly reinforces learning but also provides opportunities for practical implementation. By actively using the information we acquire, we refine our understanding and discover new ways to solve problems or create value.In conclusion, acquiring new knowledge is an ongoing journey that requires an inquisitive mindset, effective strategies, and a commitment to continuous learning. By embracing these practices, we unlock our potential to navigate the complexities of the modern world, make a meaningful impact on our communities, and live fulfilling and intellectually stimulating lives.。

方法的重载与重写区别

方法的重载与重写区别

⽅法的重载与重写区别(1)⽅法重载是让类以统⼀的⽅式处理不同类型数据的⼀种⼿段。

多个同名函数同时存在,具有不同的参数个数/类型。

重载Overloading是⼀个类中多态性的⼀种表现。

(2)的⽅法重载,就是在类中可以创建多个⽅法,它们具有相同的名字,但具有不同的参数和不同的定义。

调⽤⽅法时通过传递给它们的不同参数个数和参数类型来决定具体使⽤哪个⽅法, 这就是多态性。

(3)重载的时候,⽅法名要⼀样,但是参数类型和个数不⼀样,返回值类型可以相同也可以不相同。

⽆法以返回型别作为重载函数的区分标准。

下⾯是重载的例⼦:package c04.answer;//这是包名//这是这个程序的第⼀种编程⽅法,在main⽅法中先创建⼀个Dog类实例,然后在Dog类的构造⽅法中利⽤this关键字调⽤不同的bark⽅法。

不同的重载⽅法bark是根据其参数类型的不同⽽区分的。

//注意:除构造器以外,编译器禁⽌在其他任何地⽅中调⽤构造器。

package c04.answer;public class Dog {Dog(){this.bark();}void bark()//bark()⽅法是重载⽅法{System.out.println(\"no barking!\");this.bark(\"female\", 3.4);}void bark(String m,double l)//注意:重载的⽅法的返回值都是⼀样的,{System.out.println(\"a barking dog!\");this.bark(5, \"China\");}void bark(int a,String n)//不能以返回值区分重载⽅法,⽽只能以“参数类型”和“类名”来区分{System.out.println(\"a howling dog\");}public static void main(String[] args){Dog dog = new Dog();//dog.bark(); [Page]//dog.bark(\"male\", \"yellow\");//dog.bark(5, \"China\"); 然后我们再来谈谈重写(Overriding)(1)⽗类与⼦类之间的多态性,对⽗类的函数进⾏重新定义。

方法重载和重写的区别

方法重载和重写的区别

⽅法重载和重写的区别
答⼀:
根本区别:
重写(重构)很直观啊,⼦类覆盖了⽗类的同名同参同的⽅法,⽤⼦类调⽤的只会是重写的⽅法
重载,同名⽽已。

答⼆:
1、重载:
⽅法名相同,参数列表不同
2、重写:
也叫覆盖,指在⼦类中定义⼀个与⽗类中⽅法同名同参数列表的⽅法。

因为⼦类会继承⽗类的⽅法,⽽重写就是将从⽗类继承过来的⽅法重新定义⼀次,重新填写⽅法中的代码。

答三:
重写是⼦类的⽗类的⽅法,要求⽅法名和参数都相同
重载是在同⼀个类中的两个或两个以上的⽅法,拥有相同的⽅法名,但是参数却不相同,⽅法体也不相同,最常见的重载的例⼦就是类的,可以参考帮助⽂档看看类的
答四:
1.重写必须继承,重载不⽤。

2.重写的⽅法名,参数数⽬相同,参数类型兼容,重载的⽅法名相同,参数列表不同。

3.重写的⽅法修饰符⼤于等于⽗类的⽅法,重载和修饰符⽆关。

4.重写不可以抛出⽗类没有抛出的⼀般异常,可以抛出运⾏时异常。

C 的高级特性---函数重载,重写,覆盖

C  的高级特性---函数重载,重写,覆盖
示例8-1-1 重载函数Eat
C++语言采用重载机制的另一个理由是:类的构造函数需要重载机制。因为C++规定构造函数与类同名(请参见第9章),构造函数只能有一个名字。如果想用几种不同的方法创建对象该怎么办?别无选择,只能用重载机制来实现。所以类可以有多个同名的构造函数。
8.1.2 重载是如何实现的?
int x = Function ();
则可以判断出Function是第二个函数。问题是在C++/C程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个Function函数被调用。
所以只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。例如编译器为示例8-1-1中的三个Eat函数产生象_eat_beef、_eat_fish、_eat_chicken之类的内部标识符(不同的编译器可能产生不同风格的内部标识符)。
{
void foo(int x, int y);
… // 其它函数
}或者写成
extern “C”
{
#include “myheader.h”
… // 其它C头文件
}
这就告诉C++编译译器,函数foo是个C连接,应该到库中找名字_foo而不是找_foo_int_int。C++编译器开发商已经对C标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件。注意并不是两个函数的名字相同就能构成重载。全局函数和类的成员函数同名不算重载,因为函数的作用域不同。例如:
示例8-2-1中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆盖。

重写与重载的区别是什么

重写与重载的区别是什么

重写与重载的区别是什么⾯试时,问:重载(Overload)和重写(Override)的区别?答:⽅法的重载和重写都是实现多态的⽅式,区别在于前者实现的是编译时的多态性,⽽后者实现的是运⾏时的多态性。

重载发⽣在⼀个类中,同名的⽅法如果有不同的参数列表(参数类型不同、参数个数不同或者⼆者都不同)则视为重载;重写发⽣在⼦类与⽗类之间,重写要求⼦类被重写⽅法与⽗类被重写⽅法有相同的参数列表,有兼容的返回类型,⽐⽗类被重写⽅法更好访问,不能⽐⽗类被重写⽅法声明更多的异常(⾥⽒代换原则)。

重载对返回类型没有特殊的要求,不能根据返回类型进⾏区分。

1.重写(Override)从字⾯上看,重写就是重新写⼀遍的意思。

其实就是在⼦类中把⽗类本⾝有的⽅法重新写⼀遍。

⼦类继承了⽗类原有的⽅法,但有时⼦类并不想原封不动的继承⽗类中的某个⽅法,所以在⽅法名,参数列表,返回类型(除过⼦类中⽅法的返回值是⽗类中⽅法返回值的⼦类时)都相同的情况下,对⽅法体进⾏修改或重写,这就是重写。

但要注意⼦类函数的访问修饰权限不能少于⽗类的。

例如:public class Father {public static void main(String[] args) {// TODO Auto-generated method stubSon s = new Son();s.sayHello();}public void sayHello() {System.out.println("Hello");}}class Son extends Father{@Overridepublic void sayHello() {// TODO Auto-generated method stubSystem.out.println("hello by ");}}重写总结:1.发⽣在⽗类与⼦类之间2.⽅法名,参数列表,返回类型(除过⼦类中⽅法的返回类型是⽗类中返回类型的⼦类)必须相同3.访问修饰符的限制⼀定要⼤于被重写⽅法的访问修饰符(public>protected>default>private)4.重写⽅法⼀定不能抛出新的检查异常或者⽐被重写⽅法申明更加宽泛的检查型异常2.重载(Overload)在⼀个类中,同名的⽅法如果有不同的参数列表(参数类型不同、参数个数不同甚⾄是参数顺序不同)则视为重载。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++中重载与重写函数区别及虚函数C++中的虚函数(virtual function)1.简介虚函数是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;}};那么,在使用的时候,我们可以:A * a = new B();a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。

它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。

由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。

虚函数只能借助于指针或者引用来达到多态的效果,如果是下面这样的代码,则虽然是虚函数,但它不是多态的:class A{public:virtual void foo();};class B: public A{virtual void foo();};void bar(){A a;a.foo(); // A::foo()被调用}1.1 多态在了解了虚函数的意思之后,再考虑什么是多态就很容易了。

仍然针对上面的类层次,但是使用的方法变的复杂了一些:void bar(A * a){a->foo(); // 被调用的是A::foo() 还是B::foo()?}因为foo()是个虚函数,所以在bar这个函数中,只根据这段代码,无从确定这里被调用的是A::foo()还是B::foo(),但是可以肯定的说:如果a指向的是A类的实例,则A::foo()被调用,如果a指向的是B类的实例,则B::foo()被调用。

这种同一代码可以产生不同效果的特点,被称为“多态”。

1.2 多态有什么用?多态这么神奇,但是能用来做什么呢?这个命题我难以用一两句话概括,一般的C++教程(或者其它面向对象语言的教程)都用一个画图的例子来展示多态的用途,我就不再重复这个例子了,如果你不知道这个例子,随便找本书应该都有介绍。

我试图从一个抽象的角度描述一下,回头再结合那个画图的例子,也许你就更容易理解。

在面向对象的编程中,首先会针对数据进行抽象(确定基类)和继承(确定派生类),构成类层次。

这个类层次的使用者在使用它们的时候,如果仍然在需要基类的时候写针对基类的代码,在需要派生类的时候写针对派生类的代码,就等于类层次完全暴露在使用者面前。

如果这个类层次有任何的改变(增加了新类),都需要使用者“知道”(针对新类写代码)。

这样就增加了类层次与其使用者之间的耦合,有人把这种情况列为程序中的“bad smell”之一。

多态可以使程序员脱离这种窘境。

再回头看看1.1中的例子,bar()作为A-B这个类层次的使用者,它并不知道这个类层次中有多少个类,每个类都叫什么,但是一样可以很好的工作,当有一个C类从A类派生出来后,bar()也不需要“知道”(修改)。

这完全归功于多态--编译器针对虚函数产生了可以在运行时刻确定被调用函数的代码。

1.3 如何“动态联编”编译器是如何针对虚函数产生可以再运行时刻确定被调用函数的代码呢?也就是说,虚函数实际上是如何被编译器处理的呢?Lippman在深度探索C++对象模型[1]中的不同章节讲到了几种方式,这里把“标准的”方式简单介绍一下。

我所说的“标准”方式,也就是所谓的“VTABLE”机制。

编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。

VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。

一个类只有一个VTABLE,不管它有多少个实例。

派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE 有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。

在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。

通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写,针对1.1中的例子:void bar(A * a){a->foo();}会被改写为:void bar(A * a){(a->vptr[1])();}因为派生类和基类的foo()函数具有相同的VTABLE索引,而他们的vptr又指向不同的VTABLE,因此通过这样的方法可以在运行时刻决定调用哪个foo()函数。

虽然实际情况远非这么简单,但是基本原理大致如此。

1.4 overload和override虚函数总是在派生类中被改写,这种改写被称为“override”。

我经常混淆“overload”和“override”这两个单词。

但是随着各类C++的书越来越多,后来的程序员也许不会再犯我犯过的错误了。

但是我打算澄清一下:override是指派生类重写基类的虚函数,就象我们前面B类中重写了A 类中的foo()函数。

重写的函数必须有一致的参数表和返回值(C++标准允许返回值不同的情况,这个我会在“语法”部分简单介绍,但是很少编译器支持这个feature)。

这个单词好象一直没有什么合适的中文词汇来对应,有人译为“覆盖”,还贴切一些。

overload约定成俗的被翻译为“重载”。

是指编写一个与已有函数同名但是参数表不同的函数。

例如一个函数即可以接受整型数作为参数,也可以接受浮点数作为参数。

2. 虚函数的语法虚函数的标志是“virtual”关键字。

2.1 使用virtual关键字考虑下面的类层次:class A{public:virtual void foo();};class B: public A{public:void foo(); // 没有virtual关键字!};class C: public B // 从B继承,不是从A继承!{public:void foo(); // 也没有virtual关键字!};这种情况下,B::foo()是虚函数,C::foo()也同样是虚函数。

因此,可以说,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual 关键字。

2.2 纯虚函数如下声明表示一个函数为纯虚函数:class A{public:virtual void foo()=0; // =0标志一个虚函数为纯虚函数};一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。

它告诉使用者,我的派生类都会有这个函数。

2.3 虚析构函数析构函数也可以是虚的,甚至是纯虚的。

例如:class A{public:virtual ~A()=0; // 纯虚析构函数};当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。

考虑下面的例子:class A{public:A() { ptra_ = new char[10];}~A() { delete[] ptra_;} // 非虚析构函数private:char * ptra_;};class B: public A{public:B() { ptrb_ = new char[20];}~B() { delete[] ptrb_;}private:char * ptrb_;};void foo(){A * a = new B;delete a;}在这个例子中,程序也许不会象你想象的那样运行,在执行delete a 的时候,实际上只有A::~A()被调用了,而B类的析构函数并没有被调用!这是否有点儿可怕?如果将上面A::~A()改为virtual,就可以保证B::~B()也在delete a的时候被调用了。

因此基类的析构函数都必须是virtual的。

纯虚的析构函数并没有什么作用,是虚的就够了。

通常只有在希望将一个类变成抽象类(不能实例化的类),而这个类又没有合适的函数可以被纯虚化的时候,可以使用纯虚的析构函数来达到目的。

2.4 虚构造函数?构造函数不能是虚的。

3. 虚函数使用技巧3.1 private的虚函数考虑下面的例子:class A{public:void foo() { bar();}private:virtual void bar() { ...}};class B: public A{private:virtual void bar() { ...}};在这个例子中,虽然bar()在A类中是private的,但是仍然可以出现在派生类中,并仍然可以与public或者protected的虚函数一样产生多态的效果。

并不会因为它是private的,就发生A::foo()不能访问B::bar()的情况,也不会发生B::bar()对A::bar()的override不起作用的情况。

这种写法的语意是:A告诉B,你最好override我的bar()函数,但是你不要管它如何使用,也不要自己调用这个函数。

3.2 构造函数和析构函数中的虚函数调用一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。

也就是说不能在构造函数和析构函数中让自己“多态”。

例如:class A{public:A() { foo();} // 在这里,无论如何都是A::foo()被调用!~A() { foo();} // 同上virtual void foo();};class B: public A{public:virtual void foo();};void bar(){A * a = new B;delete a;}如果你希望delete a的时候,会导致B::foo()被调用,那么你就错了。

同样,在new B的时候,A的构造函数被调用,但是在A的构造函数中,被调用的是A::foo()而不是B::foo()。

3.3 多继承中的虚函数3.4 什么时候使用虚函数在你设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的。

从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现。

通过这样的方法,就可以将对象的行为抽象化。

以设计模式[2]中Factory Method模式为例,Creator的factoryMethod()就是虚函数,派生类override这个函数后,产生不同的Product类,被产生的Product类被基类的AnOperation()函数使用。

相关文档
最新文档