当前位置:首页 > 天道酬勤 > 正文内容

构造函数可以声明为虚函数(实函数和虚函数)

张世龙2021年12月21日 09:38天道酬勤510

首先,强调概念

将函数定义为虚函数,并不意味着函数是无法实现的函数。

他之所以被定义为虚函数,是为了允许基类的指针调用子类的这个函数。

只有将函数定义为纯虚函数,才意味着函数没有实现。

定义纯虚函数是为了实现接口,起到规格的作用,规格继承的程序员必须实现这个函数。

1、简介

中,假设有以下类级别:

实例

{

公共:

虚拟语音foo (

{

:3360 foo (IS呼叫结束;

}

(;

b :类公共a

{

公共:

void foo () )

{

cout ' b :3360 foo (IS呼叫结束;

}

(;

int main (语音) )。

{

a * a=新乙(;

a-foo (; //这里,a是指向a的指针,但是要调用的函数(foo )是b!

返回0;

}

这个例子是虚函数的典型应用,通过这个例子,你可能对虚函数有一些概念。 那就相当于所谓的“后联编辑”和“动态联编”,一个类函数的调用不是由编译时刻决定的,而是由执行时刻决定的。 因为编写代码时不知道是调用基类的函数还是哪个派生类的函数,所以它被设置为“虚”函数。

虚函数只能通过指针或引用来获得多态性的效果。

C++纯虚函数

一、定义

 

纯虚函数是在基类中声明的虚函数,在基类中未定义,但必须为每个派生类定义自己的实现方法。 在基类中实现纯虚函数的方法是在函数原型之后添加=0:

 

虚拟语音函数1 ()=0

二、引进理由

1、为了便于使用多态性特性,经常需要在基类中定义虚拟函数。

2、在大多数情况下,基类本身生成对象是没有道理的。 例如,动物可以作为基类派生出老虎和孔雀等子类,但动物自身生成对象显然是不常识的。

为了解决上述问题,我们引入了纯虚函数的概念,并将函数定义为纯虚函数(如果是这样的话,编译器要求必须改写,以便在派生类中实现多态性。 包含纯虚拟函数的类称为抽象类,不能生成对象。 这样就很好地解决了上述两个问题。

声明纯虚函数的类是抽象类。 因此,用户不能创建类的实例。 只能创建派生类的实例。

纯函数最明显的特征是必须在继承类中重新声明函数。 (请不要设定后面的=0。 否则,其派生类也无法实例化。 )此外,抽象类中经常没有定义。

定义纯虚函数的目的是确保派生类只是继承函数的接口。

纯虚函数的含义是允许所有类对象,主要是派生类对象执行纯虚函数的行为,但类不能为纯虚函数提供合理的缺省实现。 这就是为什么类纯虚函数的声明告诉子类的设计者“你必须提供纯虚函数的实现,但我不知道你怎么实现它”。

抽象类的介绍

抽象类是为抽象和设计目的而创建的特殊类,位于继承层次的上层。

(1)抽象类的定义:具有纯虚函数的类被称为抽象类。

(2)抽象类的作用:抽象类的主要作用是将相关操作作为结果接口组织成一个继承层次结构,这为派生类提供了共同的途径,派生类在其基类中具体实现作为接口的操作。 所以派生类实际上刻画了子类操作界面的共同含义,这些含义也可以传递到子类,子类可以具体实现这些含义,还可以将这些含义传递到自己的子类。

)3)使用抽象类时的注意事项:

抽象类只能作为基类使用,其纯虚函数的实现由派生类提供。 如果派生类没有重新定义纯虚函数,而只是继承基类的纯虚函数,则该派生类仍然是抽象类。 当派生类被给出基类的纯虚函数实现时,其派生类不再是抽象类,而是可以创建对象的具体类。 抽象类不能定义对象。

总结:

1、纯虚函数的宣言如下。 虚拟语音函数1 () )=0; 纯虚函数一定没有定义。 纯虚函数用于规范派生类的行为,即接口。 包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。 2、虚函数声明如下。 虚拟函数必须实现,否则编译器将报告错误。 错误消息:错误链接* * * * * :解析外部同步模块'公共:虚拟语音_ _物理类名称33603:虚拟功能

3、虚函数的情况下,父类和子类有各自的版本。 以多态方式调用时动态绑定。 4、子类实现了对虚函数、子类进行编程的纯虚函数的子类

的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。5、虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。6、在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。7、友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。8、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。

有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。

定义纯虚函数就是为了让基类不可实例化化,因为实例化这样的抽象数据结构本身并没有意义,或者给出实现也没有意义。

实际上我个人认为纯虚函数的引入,是出于两个目的:

1、为了安全,因为避免任何需要明确但是因为不小心而导致的未知的结果,提醒子类去做应做的实现。2、为了效率,不是程序执行的效率,而是为了编码的效率。

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26229.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。