族谱网 头条 人物百科

虚函数

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:452
转发:0
评论:0
程序示例例如,一个基类Animal有一个虚函数eat。子类Fish要实做一个函数eat(),这个子类Fish与子类Wolf是完全不同的,但是你可以引用类别Animal底下的函数eat()定义,而使用子类Fish底下函数eat()的进程。C++以下代码是C++的程序示例。要注意的是,这个示例没有异常处理的代码。尤其是new或是vector::push_back丢出一个异常时,程序在运行时有可能会出现当掉或是错误的现象。类别Animal的区块图#include#includeusingnamespacestd;classAnimal{public:virtualvoideat()const{cout<<"IeatlikeagenericAnimal."<<endl;}virtual~Animal(){}};classWolf:publicAnimal{public:voideat()const...

程序示例

例如,一个基类 Animal 有一个虚函数 eat。子类 Fish 要实做一个函数 eat(),这个子类 Fish 与子类 Wolf 是完全不同的,但是你可以引用类别 Animal 底下的函数 eat() 定义,而使用子类 Fish 底下函数 eat() 的进程。

C++

以下代码是 C++ 的程序示例。要注意的是,这个示例没有异常处理的代码。尤其是 new 或是 vector::push_back 丢出一个异常时,程序在运行时有可能会出现当掉或是错误的现象。

虚函数

类别 Animal 的区块图

# include # include usingnamespacestd;classAnimal{public:virtualvoideat()const{cout<<"I eat like a generic Animal."<<endl;}virtual~Animal(){}};classWolf:publicAnimal{public:voideat()const{cout<<"I eat like a wolf!"<<endl;}};classFish:publicAnimal{public:voideat()const{cout<<"I eat like a fish!"<<endl;}};classGoldFish:publicFish{public:voideat()const{cout<<"I eat like a goldfish!"<<endl;}};classOtherAnimal:publicAnimal{};intmain(){std::vectoranimals;animals.push_back(newAnimal());animals.push_back(newWolf());animals.push_back(newFish());animals.push_back(newGoldFish());animals.push_back(newOtherAnimal());for(std::vector::const_iteratorit=animals.begin();it!=animals.end();++it){(*it)->eat();delete*it;}return0;}

以下是虚函数 Animal::eat() 的输出:

当 Animal::eat() 不是被宣告为虚函数时,输出如下所示:

Java

在Java语言中, 所有的方法默认都是"虚函数". 只有以关键字 final 标记的方法才是非虚函数. 以下是 Java 中虚方法的一个例子:

importjava.util.*;publicclassAnimal{publicvoideat(){System.out.println("I eat like a generic Animal.");}publicstaticvoidmain(String[]args){Listanimals=newLinkedList();animals.add(newAnimal());animals.add(newWolf());animals.add(newFish());animals.add(newOtherAnimal());for(AnimalcurrentAnimal:animals){currentAnimal.eat();}}}publicclassWolfextendsAnimal{publicvoideat(){System.out.println("I eat like a wolf!");}}publicclassFishextendsAnimal{publicvoideat(){System.out.println("I eat like a fish!");}}publicclassOtherAnimalextendsAnimal{}

输出:

C#

在 C# 语言中, 对基类中的任何虚方法必须用 virtual 修饰, 而派生类中由基类继承而来的重载方法必须用 override 修饰. 一下是 C# 的一个程序实例:

usingSystem;usingSystem.Collections.Generic;namespaceConsoleApplication1{publicclassAnimal{publicvirtualvoidEat(){Console.WriteLine("I eat like a generic Animal.");}}publicclassWolf:Animal{publicoverridevoidEat(){Console.WriteLine("I eat like a wolf!");}}publicclassFish:Animal{publicoverridevoidEat(){Console.WriteLine("I eat like a fish!");}}publicclassGoldFish:Fish{publicoverridevoidEat(){Console.WriteLine("I eat like a goldfish!");}}publicclassOtherAnimal:Animal{// Eat() method is not overridden, so the base class method will be used.}publicclassProgram{publicstaticvoidMain(string[]args){IListanimals=newList();animals.Add(newAnimal());animals.Add(newWolf());animals.Add(newFish());animals.Add(newGoldFish());animals.Add(newOtherAnimal());foreach(AnimalcurrentAnimalinanimals){currentAnimal.Eat();}}}}

输出:

抽象类和纯虚函数

纯虚函数或纯虚方法是一个需要被非抽象的派生类覆盖(override)的虚函数. 包含纯虚方法的类被称作抽象类; 抽象类不能被直接实例化。 一个抽象基类的一个子类只有在所有的纯虚函数在该类(或其父类)内给出实现时, 才能直接实例化. 纯虚方法通常只有声明(签名)而没有定义(实现),但有特例情形要求纯虚函数必须给出函数体定义.

作为一个例子, 抽象基类"MathSymbol"可能提供一个纯虚函数 doOperation(), 和派生类 "Plus" 和 "Minus" 提供doOperation() 的具体实现. 由于 "MathSymbol" 是一个抽象概念, 为其每个子类定义了同一的动作, 在 "MathSymbol" 类中执行 doOperation() 没有任何意义. 类似的, 一个给定的 "MathSymbol" 子类如果没有 doOperation() 的具体实现是不完全的.

虽然纯虚方法通常在定义它的类中没有实现, 在 C++ 语言中, 允许纯虚函数在定义它的类中包含其实现, 这为派生类提供了备用或默认的行为. C++的虚基类的虚析构函数必须提供函数体定义,否则链接时(linking)在析构该抽象类的派生实例对象的语句处会报错。

C++

在C++语言中, 纯虚函数用一种特别的语法[=0]定义(但 VS 也支持 abstract 关键字:virtual ReturnType Function()abstract;), 见以下示例.

classAbstract{public:virtualvoidpure_virtual()=0;};

纯虚函数的定义仅提供方法的原型. 虽然在抽象类中通常不提供纯虚函数的实现, 但是抽象类中可以包含其实现, 而且可以不在声明的同时给出定义. 每个非抽象子类仍然需要重载该方法, 抽象类中实现的调用可以采用以下这种形式:

voidAbstract::pure_virtual(){// do something}classChild:publicAbstract{virtualvoidpure_virtual();// no longer abstract, this class may be// instantiated.};voidChild::pure_virtual(){Abstract::pure_virtual();// the implementation in the abstract class // is executed}

参考文献

C++ FAQ LiteCopyright © 1991-2006, Marshall Cline.


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· Γ函数
定义ΓΓ-->{\displaystyle\Gamma\,}函数可欧拉过欧拉(Euler)第二类积分定义:对复数z{\displaystylez\,},我们要求Re(z)>0{\displaystyle\mathrm{Re}(z)>0}。ΓΓ-->{\displaystyle\Gamma}函数还可以通过对e−−-->t{\displaystyle\mathrm{e}^{-泰勒\,}做泰勒展开,解析延拓到整个复平面:ΓΓ-->(z)=∫∫-->1∞∞-->tz−−-->1etdt+∑∑-->n=0∞∞-->(−−-->1)nn!1n+z{\displaystyle\Gamma(z)=\int_{1}^{\infty}{\frac{t^{z-1}}{\mathrm{e}^{t}}}{\rm{d}}t+\sum_{n=0}^...
· 函数
定义函数f的部分图像。每个实数的x都与f(x)=x−9x相联系。从输入值集合X{\displaystyleX}到可能的输出值集合Y{\displaystyleY}的函数f{\displaystylef}(记作f:X→→-->Y{\displaystylef:X\toY})是X{\displaystyleX}与Y{\displaystyleY关系的关系,满足如下条件:f{\displaystylef}是完全的:对集合X{\displaystyleX}中任一元素x{\displaystylex}都有集合Y{\displaystyleY}中的元素y{\displaystyley}满足xfy{\displaystylexfy}(x{\displaystylex}与y{\displaystyley}是f{\displaystylef}相关的)。即,对每一个输入值,y{\displaystyle...
· 态函数
简单系统的的热力学函数简单热力学系统(如量子、经典气体系统)一般具有以下热力学函数,可以任意选取其中两个作为独立变量:量纲(单位)不是能量的热力学函数量纲(单位)是能量的热力学势热力学势上面给出的热力学函数中,后四个具有能量的量纲,单位都为焦耳,这四个量通常称为热力学势。其中,具有广义力和广义位移Xi{\displaystyleX_{i}}xi{\displaystylex_{i}}热力学系统,内能U{\displaystyleU}的微分式可从热力学第一定律得知:公式内的U、S和V是热力学的状态函数,也可用于非平衡、不可逆的过程。其余三个热力学势可经由勒让德变换(Legendretransform)转换自变数而得到。通过对以上微分表达式求偏导,可以得到T,S,P,V四个变量的偏导数间的“麦氏关系”相关条目热力学势参考Alberty,R.A.UseofLegendretransformsin...
· 幂函数
自然数幂自然数幂函数x的定义为自变量自乘n次,如有理数幂形如的幂函数定义为的多值反函数。但实际上,我们还是只取主值。无理数幂无理数幂可以由有理数列逼近得到。复数幂扩大的幂函数定义为为一个多值函数幂函数图像上至下:x,x,x,x,x,x,x一些典型的有理数幂函数图象
· 函数极限
定义c{\displaystylec},L{\displaystyleL}皆为实数,f:(−−-->∞∞-->,c−−-->δδ-->)∪∪-->(c+δδ-->,+∞∞-->)→→-->R{\displaystylef:(-\infty,c-\delta)\cup(c+\delta,+\infty)\rightarrow\mathbb{R}},当x→→-->c{\displaystylex\rightarrowc}时,f(x)→→-->L{\displaystylef(x)\rightarrowL}当且仅当︰任一个ϵϵ-->>0{\displaystyle\epsilon>0},必存在一个δδ-->>0{\displaystyle\delta>0},使得若0|x−−-->c|δδ--&g...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信