|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
大家可以自己去看一看.可以说看得想呕吐.以前有次下了个动网来看.里面连基本内置函数的保护措施(函数没防御性)都没有.难怪经常补这个补那个了.可能现在.NET版会好点吧c++|函数C++和Delphi的函数掩盖(Override)与重载(overload)
Spacesoft【暗夜狂沙】
在面向工具编程中,当子类承继了来自基类的函数后,子类有大概必要对个中的一些函数作出与基类分歧处置,好比:
classCHuman
{
public:
voidSayMyName()//打印出工具的姓名
{
cout<<"Hi,Iamahuman"<<endl;
}
};
那末很分明,假设他的子类有一个同名、同参数和前往值(一句话,一摸一样)的函数SayMyName,它会挪用哪一个函数呢?好比如今有一个classCMark
classCMark:publicCHuman
{
public:
voidSayMyName()
{
cout<<"Hi,Iammark"<<endl;
}
};
那末我们要问,上面的程序段:
CHuman*pH=newCMark;
if(pH)
pH->SayMyName();
else
cout<<"casterror!"<<endl;
deletepH;
pH=NULL;
要打印出来的,真的是我们想要的Hi,Iammark吗?
不是。它输入了Hi,Iamahuman。这很糟,当我们指着一团体要他说出本人的名字的时分,他却告知我们他“是一团体”,而不是说出本人的名字。呈现如许的成绩缘故原由在于,用基类的指针指向私有派生类,能够会见派生类从基类中承继的成员函数。但假如派生类中也有同名的函数,则了局仍旧是会见基类的同名函数,而不是派生类自己的函数。而现实上,我们但愿的是由一个工具的实在范例来决意究竟该挪用这些同名函数中的哪个,就是说,如许的决定是静态(Dynamic)的。大概我们能够说,我们但愿当一个工具是子范例时,它的同名函数在子类中的完成掩盖(override)失落基类的完成。
我们先从C++对这个成绩的处置提及。
这是C++中对照典范的多态的例子,C++用虚函数来完成如许的多态。详细点说,就是利用virtual关头字来将函数申明成虚函数,在上一个例子中就是应当声明成:
classCHuman
{
public:
virtualvoidSayMyName()//打印出工具的姓名
{
cout<<"Hi,Iamahuman"<<endl;
}
};
如许,其他的代码仍是谁人老模样,可是我们的CMark已晓得怎样说本人的名字了。CMark的SayMyName()函数是不是加了virtual关头字的申明并没有干系,由于依据C++语法的划定,由于它掩盖了CHuman的同名函数,它本人也就成为virtual的了。至于为何一个virtual关头字有那末奇妙的效果呢?C++FAQLite对此是如许申明的:在C++中,“虚成员函数是静态断定的(在运转时)。也就是说,成员函数(在运转时)主动态地选择,该选择基于工具的范例,而不是指向该工具的指针/援用的范例”。因而我们的pH就发明本人实在指向的是一个CMark范例的工具,而不是本人的范例所声明的CHuman,以是它伶俐的挪用了CMark的SayMyName。
而Delphi就是用override关头字来讲明函数掩盖的。被掩盖的函数必需是虚(virtual)的,大概是静态(dynamic)的,也就是说该函数在声明时应当包括这两个唆使字中的一个,好比:
procedureDraw;virtual;
在必要掩盖的时分,只必要在子类顶用override唆使字从头声明一下就能够了。
procedureDraw;override;
在语法下去说,声明为virtual和dynamic是等价的。它们的不同在于,前者在完成上对速率举行了优化,尔后者对代码巨细举行了优化。
假设基类和子类都含有统一个函数名和参数,而且在子类中不加override唆使字呢?这在语法上也是准确的。这意味着子类的函数同名完成把基类的完成埋没(hide)失落了,只管这两者在派生类中都存在。那末就回到了本文开首的第一个例子申明的情形:当我们指着一团体要他说出本人的名字的时分,他却告知我们他“是一团体”,而不是说出本人的名字。
值得注重的是,与我们在C++中经常不加辨别的把掩盖一个函数和重载一个函数通称为重载分歧,在Delphi中,只要重载(overload)才是我们平常所说的重载,被重载的函数仍然存在,依托参数来决意究竟挪用谁人完成。固然,当overload失落的函数和基类的函数参数不异时,基类的完成就被hide失落了,就像下面提到的一样。而掩盖(override)则是把让被掩盖的函数不成见了,确的确实的"掩盖"失落了,本来的完成就不见了。基于如许的缘故原由,很多文章乃至一些书都毛病的把override翻译成重载,笔者以为其实不符合。
</p>对用户来说可预见费用、节约费用,可以做到花少钱办大事。由于省去了购买软件和硬件等的前期费用,用户可以租用较高级的应用软件。ASP的收费是根据软件的类型、客制化程度、用户数量、服务期限来定的,对客户来说这笔费用是可以预见的。方便于客户应用软件的升级。 |
|