扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写 。
柳林网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联建站2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
抽象函数是没有代码,子类继承后一定要重写
在一个类中用虚函数:
是因为在超类中的有实际代码的方法,但明确允许子类可以作重写
而且当子类重写后,可以用子类实例超类;如果这样,超类变量调用虚函数时,执行的是子类的方法
在一个类中用抽象函数
是在写超类时不确定函数的代码,让子类去实现
抽象函数没有方法体。
简单来说虚函数(Virtual)已经包含了也必须包含默认的实现,所以在派生类中可以重新实现也可以不实现这些虚函数。
抽象函数(abstract)没有提供默认实现,所以在派生类中必须实现这些抽象函数。
接口中的函数类似于抽象函数,也不提供默认实现,实现接口的类也必须实现这些函数。
但接口可用于多继承,即,类只能从一个类继承,但可同时实现多个接口。
面向对象第一阶段,理解面向对象术语体系。楼主显然正在这样的阶段里徘徊。
-------------------------------------------------------------------------------------------------------------------------------
当然这也无怪楼主,比如楼下的回答。有些是所谓存在即合理的论调都抛出来了,这是要以道理压人啊——这分明是说,我虽然也不知道,但存在即合理。当然还是从抽象类与普通类的区别上来说了,一个强制重写,一个不强制重写,假定我们不用IDE而是用记事本编程,那么提示编程人员的重写功能似乎说不过去了,如果说编译时提醒,那么如果编译器不是那么完美呢?显然,并没有说中要害。
——————————————————————————————————————————
在面向对象的第一阶段确实不好理解,但在第二阶段,模式设计时,也许会有不少人告诉你,尽量不要用继承,因为继承的耦合性非常大,那么这时候可能自觉不自觉地去理解这些东西了。至于面向切面编程告诉你,如果你继承于一个普通类,那么一定是继承树有问题,也不会是质量较高的代码了。所以面向切面编程要求被继承的父类必须是抽象类。
——————————————————————————————————————————
先从原理说起:怎么去抽象?
如果多个类实现相同的方法,那么该方法体与签名应提升到父类中去,继承的子类就具有相同的行为,这一点可以保证被继承的子类在父类方法修改时可以同时修改。
但是如果有一些类与大多数类实现的行为不同,那么应将该方法体与签名提升到父类中,同时允许部分子类重写,也就是写成虚方法。虚方法修改时会影响到大部分类的行为,但不会影响到对虚方法重写类的行为。
如果大多数类实现有相同的签名,但几乎每个方法都不相同,则应将方法签名提升到父类,做抽象方法以提子类重写——这里有一个前提条件,就是在父类被调用或父类其他方法中对子类延迟实现的方法有调用。如果没有父类层的代替调用,那么这些完全不同行为的方法为何还要提升到父类中去呢?这样多此一举?
这句话可能难以理解一点,举个例子吧,抽象父类可能是框架结构上的元素,调用方根据迪米特法则(知识最少原则)只了解抽象父类,而各子类的实现是模块另外一个程序员开发组实现的。根据里氏代换,调用父类其实可以实现具体子类的功能,但子类的具体实现却不是调用方关心的。还有就是父类在调用层次上直接调用了某个保护函数(protected),这个函数延迟到子类实现。
现在,我们看到了这些功能上使用上区别,但显然虚方法与抽象方法似乎有着相同的功能,其实是抽象的方式不太一样,虚方法是大多子类要实现的功能,而抽象方法是几乎所有子类均实现不同的功能。这一点上似乎两者区别性不是很大,尤其是没有较高的面向对象编程经验的时候,两者看起来似乎是通用的。但是有个特定行为,更能决定两者的区别,子类重写时可能会执行base.XXX();同名方法,这个如果抽象方法是不被支持的。这里可以看到虚方法可能是部分类行为的实现(大多数类行为相同),也可能是大多数类行为的部分实现。
所以从抽象方式上可以看出,抽象方法与虚方法来源于不同抽象方式,两者其实是没有可比性的,该用到哪一种看抽象的行为一般是不会用错的。
-------------------------------------------------------------------------------------------------------------------------
再从框架说起,从原理其实是一种自底向上的分析方式,而框架则是自顶向下分析。那么接口与抽象类不能是简单的结构了,而是一个接口协议,也就是说我们使用接口或抽象类向业务实现编程人员定义协议,而由编程人员去编程实现,那么,抽象方法表示必须由实现人员实现的行为,而虚方法则是可由实现人员选择性实现的行为(这也是编译会让抽象方法不能通过编译的原因)。两者也有明显的区别。
所以框架编程上来说,两者也不会弄混,而造成误用。
————————————————————————————————————————
单纯语言层面上来,虚方法实现一个空的方法体,然后使用文档要求实现人员必须实现,其实未尝不可,也就是说虚方法单从语言方面来说,完全可以用虚方法来代替抽象方法的。当然我这里只是说单纯的语言层面上。
但一个项目工程是由易理解性(你真的能确定用虚方法代替抽象方法的理解是正确的么),易维护性(你确认其他编程人员对象的这种理解能达到同步么)等多种方面来衡量的,如果真是有较强的管理,完备的文档等那么单从语言层面上去代替是可行的。
————————————————————————————————————————
所以,如果做为程序员真着眼于语言层面,那么其实理解很多东西都是错的,就象readonly与const的区别一样,两者其实只是换种方式的实现,但对于软件工程来说,可能是一大漏洞。
————————————————————————————————————————
最后要说的是,真正的软件编程,必须保证最简继承树,或者尽量少用继承。一般情况下,继承树只要两层,除非有足够的必要,但除叶层外其他的均必须为抽象类(虽然普通类也可以继承)。所以其实继承上的问题不多,因为没有足够的理由是不用的。能提出这样的问题,至少说话程序员的态度是正确的,敏而好学,善于思考,但软件业是一个复杂行业,有些东西只有触到更高的层次才会理解,有些问题可以放一放,日后其实应该知道该怎么做,只不过可能自己也说不清楚为什么这么做而已。
一般形式为y=f(x)且无法用数字和字母表示出来的函数,一般出现在题目中,或许有定义域、值域等。
补充: 幂函数:f(xy)=f(x)f(y) 正比例函数f(x+y)=f(x)+f(y) 对数函数f(x)+f(y)=f(x)f(y) 三角函数f(x+y)+f(x-y)=2f(x)f(y) 指数函数f(x+y)=f(x)f(y) 抽象函数常常与周期函数结合,如: f(x)=-f(x+2) f(x)=f(x+4)
2解抽象函数题,通常要用赋值法,而且高考数学中,常常要先求F(0) F(1) 抽象函数的经典题目!
编辑本段解法精选
特殊值法
一.特殊值法:在处理选择题时有意想不到的效果。 例1 定义在R上的函数f(x)满足f (x + y) = f (x) + f ( y )(x,y∈R),当x0时,, f (x)0,则函数f (x)在[a,b]上 ( ) A 有最小值f (a) B有最大值f (b) C有最小值f (b) D有最大值f ( b) 分析:许多抽象函数是由特殊函数抽象背景而得到的,如正比例函数f (x)= kx(k≠0), , , ,可抽象为f (x + y) = f (x) +f (y),与此类似的还有 特殊函数 抽象函数 f (x)= x f (xy) =f (x) f (y) f (x)= 0 f (x+y)= f (xy) f (x)= 0 f (xy) = f (x)+f (y) f (x)= tanx f(x+y)= 此题作为选择题可采用特殊值函数f (x)= kx(k≠0) ∵当x 0时f (x) 0即kx 0。.∴k 0,可得f (x)在[a,b]上单调递减,从而在[a,b]上有最小值f(b)。
赋值法
二.赋值法.根据所要证明的或求解的问题使自变量取某些特殊值,从而来解决问题。 例2 除了用刚才的方法外,也可采用赋值法 解:令y = -x,则由f (x + y) = f (x) + f (y) (x,y∈R)得f (0) = f (x) +f (-x)…..①, 再令x = y = 0得f(0)= f(0)+ f(0)得f (0)=0,代入①式得f (-x)= -f(x)。 得 f (x)是一个奇函数,图像关于原点对称 。 ∵当x 0时,f (x) 0, 即f (x)在R上是一个减函数,可得f (x)在[a,b]上有最小值f(b)。
图像性质解法
三.利用函数的图象性质来解题: 抽象函数虽然没有给出具体的解析式,但可利用它的性质图象直接来解题。 抽象函数解题时常要用到以下结论: 定理1:如果函数y=f(x)满足f(a+x)=f(b-x),则函数y=f(x)的图象关于x=(a+b)/2 对称。 定理2:如果函数y=f(x)满足f(a+x)=f(b+x),则函数y=f(x)是一个周期函数,周期为a-b。 例4 f(x)是定义在R上的偶函数,且f(x)=f(2-x),证明f(x)是周期函数。 分析:由 f(x)=f(2-x),得 f(x)的图象关于x=1对称,又f(x)是定义在R上的偶函数,图象关于y轴对称,根据上述条件,可先画出符合条件的一个图,那么就可以化无形为有形,化抽象为具体。从图上直观地判断,然后再作证明。 由图可直观得T=2,要证其为周期函数,只需证f (x) = f (2 + x)。 证明:f (x) = f (-x) = f [2-(-x)] = f (2 + x),∴ T=2。 ∴f (x)是一个周期函数。 例5 已知定义在[-2,2]上的偶函数,f (x)在区间[0,2]上单调递减,若f (1-m)f (m),求实数m的取值范围 分析:根据函数的定义域,-m,m∈[-2,2],但是1- m和m分别在[-2,0]和[0,2]的哪个区间内呢?如果就此讨论,将十分复杂,如果注意到偶函数,则f (x)有性质f(-x)= f (x)=f ( |x| ),就可避免一场大规模讨论。 解:∵f (x)是偶函数, f (1-m)f(m) 可得 ,∴f(x)在[0,2]上是单调递减的,于是 ,即 化简得-1≤m 。
编辑本段怎样学好抽象函数
函数其实在初中的时候就已经讲过了,当然那时候是最简单的一次和二次,而整个高中函数最富有戏剧性的函数实际上也就是二次函数,学好函数总的策略是掌握每一种函数的性质,这样就可以运用自如,有备无患了。函数的性质一般有单调性、奇偶性、有界性及周期性。能够完美体现上述性质的函数在中学阶段只有三角函数中的正弦函数和余弦函数。以上是函数的基本性质,通过奇偶性可以衍生出对称性,这样就和二次函数联系起来了,事实上,二次函数可以和以上所有性质联系起来,任何函数都可以,因为这些性质就是在大量的基本函数中抽象出来为了更加形象地描述它们的。我相信这点你定是深有体会。剩下的幂函数、指数函数对数函数等等本身并不复杂,只要抓住其性质,例如对数函数的定义域,指数函数的值域等等,出题人可以大做文章,答题人可以纵横捭阖畅游其中。性质是函数最本质的东西,世界的本质就是简单,复杂只是起外在的表现形式,函数能够很好到体现这点。另外,高三还要学导数,学好了可以帮助理解以前的东西,学不好还会扰乱人的思路,所以,我建议你去预习,因为预习绝对不会使你落后,我最核心的学习经验就是预习,这种方法使我的数学远远领先其它同学而立于不败之地。 综上,在学习函数的过程中,你要抓住其性质,而反馈到学习方法上你就应该预习(有能力的话最好能够自学) 。函数是高考重点中的重点,也就是高考的命题当中确实含有以函数为纲的思想,怎样学好函数主要掌握以下几点。第一,要知道高考考查的六个重点函数,一,指数函数;二,对数函数;三,三角函数;四,二次函数;五,最减分次函数;六,双勾函数Y=X+A/X(A>0)。要掌握函数的性质和图象,利用这些函数的性质和图象来解题。另外,要总结函数的解题方法,函数的解题方法主要有三种,第一种方法是基本函数法,就是利用基本函数的性质和图象来解题;第二种方法是构造辅助函数;第三种方法是函数建模法。要特别突出函数与方程的思想,数形结合思想。 (如果刚开始学抽象函数,只须掌握赋值法.) 高一函数解题思路 1,首先把握定义和题目的叙述 2,记住一次函数与坐标轴的交点坐标,必须很熟 3,掌握问题的叙述,通法通则是连立方程(当然是有交点的情况) 一般我们解题时 可以先考虑我们学习过的与本题目相似的函数,比如本题可以考虑对数函数,帮助我们解决问题,猜测出结论再做,总要方便一些的
你说的是c++的抽象类
纯虚函数和抽象类
纯虚函数是一种特殊的虚函数,它的一般格式如下:
class 类名
{
virtual 类型函数名(参数表)=0;
…
};
在许多情况下,在基类中不能对虚函数给出有意义有实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。下面给出一个纯虚函数的例子。
#include
class point
{
public:
point(int i=0, int j=0) { x0=i; y0=j; }
virtual void set() = 0;
virtual void draw() = 0;
protected:
int x0, y0;
};
class line : public point
{
public:
line(int i=0, int j=0, int m=0, int n=0):point(i, j)
{
x1=m; y1=n;
}
void set() { cout"line::set() called.\n"; }
void draw() { cout"line::draw() called.\n"; }
protected:
int x1, y1;
};
class ellipse : public point
{
public:
ellipse(int i=0, int j=0, int p=0, int q=0):point(i, j)
{
x2=p; y2=q;
}
void set() { cout"ellipse::set() called.\n"; }
void draw() { cout"ellipse::draw() called.\n"; }
protected:
int x2, y2;
};
void drawobj(point *p)
{
p-draw();
}
void setobj(point *p)
{
p-set();
}
void main()
{
line *lineobj = new line;
ellipse *elliobj = new ellipse;
drawobj(lineobj);
drawobj(elliobj);
cout setobj(lineobj);
setobj(elliobj);
cout"\nRedraw the object...\n";
drawobj(lineobj);
drawobj(elliobj);
}
抽象类
带有纯虚函数的类称为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。
抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。
抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。
抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。
抽象函数即是不知道解析式的函数
不知道解析式还要
1)求函数值2)研究奇偶性单调性3)解不等式
等等
如:
对于任意实数x,y,f(x)总满足
f(x+y)=f(x)+f(y)
(1)求f(0)
(2)判断奇偶性
(3)若x0时,f(x)0证明函数是增函数
(4)在(3)的条件下解不等式
f(2x-1)f(3-4x)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流