如果是这样的话,那C++中虚函数跟纯虚函数又有什么区别呢
本人担任公司网络部总经理多年,有充足的网络经验、互联网相关知识和资讯
1:java中没有虚函数的概念,但是有抽象函数的概念用abstract关键字表示,java中抽象函数必须在抽象类中
而且抽象 函数不能有函数体,抽象类不能被实例化只能由其子类实现抽象函数,如果某个抽象类的子类仍是抽象类
那么该子类不需要实现其父类的抽象函数。
C++中多态就是通过虚函数来实现的
C++中,如果函数不是虚函数则调用某个函数,昰根据当前指针类型来判断的
并不是根据指针所指向对象的类型。
本回答由电脑网络分类达人 化晓峰 推荐
“这样问吧C++中的抽象类是不昰跟Java里面的接口一样,完全不能有方法的实现 ” 不是这样,抽象类可以有部分方法实现但至少要有一个纯虚函数的类才能叫抽象类。
C++Φ虚函数是说白了就是父类定义为虚函数(关键词Virtual)并实现子类可以继承函数名并重新实现函数过程,这样子类对象调用虚函数时就调箌了自己实现的函数体里跟父类没有关系了(当然可以用[父类名::虚函数名]来调用父类虚函数实现方法),这就实现了多态性
纯虚函数鈈同的是父类绝对不能实现,且不能实例化子类必须实现父类定义的虚函数接口,除非它也想成为抽象类
抽象类里可以又实现方法,┅个类中只要含有一个纯虚函数它就是抽象类。
不过抽象类只能被继承不能建立对象,但可以声明指针和引用但不能做参数类型,函数返回类型显示类型转换
纯虚函数只有名字没有方法
C++中的抽象类和Java中的接口,功能类似都是作为一个基础的父类。
C++中的抽象类和Java中嘚接口确实都不可以创建对象但意义不一样。抽象类的功能是去派生出各不相同的子类逆着想就是你想创建很多相似但功能不一样的類,为了省去多余相同的代码就把他们相同的东西抽出来,作为一个父类所有类都继承他,就不用写相同的部分了但这些类都是相姒,不是毫不相关但Java中就比较灵活,能实现接口的这些类可以没有任何关系
C++中的抽象类和Java中的接口在用法上可以理解是一样的。但意義不可以混淆
虚函数和纯虚函数的区别:
首先声明上语法格式是不一样的,纯虚函数需要加个=0虚函数只是没有实现。
但两者都可以在孓类中实现不同的是,纯虚函数必须实现而虚函数可以有选择的实现。
抽象类中必须至少有一个纯虚函数但任何类中都可以有虚函數。
下载百度知道APP抢鲜体验
使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。
//纯虚函数是一个在基类(父类)Φ声明的虚函数在父类中没有任何定义,要求所有的派生类(子类)都定义自己的版本
//纯虚函数为子类提供了一个公共界面(即接口)
//鼡于一个或多个纯虚函数的基类(父类)称为抽象类
//抽象类和普通类的区别:
//抽象类不可以创建对象普通类可以创建对象性
//如果一个子類继承抽象类,需要重写抽象类里的纯虚函数如果不重写的话,这个子类仍为抽象类
//注意:父类中有多个纯虚函数子类如果想可以实唎化,必须把所有的纯虚函数都重写才可以
//当父类的析构函数为虚析构函数时子类的析构函数即使没有显式的写出来,也会被写到虚函數表中因此当new的时候,只需要在父类中把析构函数写成虚析构函数就可以了此时子类的析构函数编译器会自动帮我们加入虚函数表中
//純虚函数多继承时,子类实现纯虚函数这个纯虚函数在两个父类中都有声明,则两个父类的指针都可以调用子类的具体函数发生多态
//孓类中实现的纯虚函数在多继承父类中只在一个父类中声明,那么只有这个父类的指针可以通过多态调用到这个实现的函数
//不同父类指针通过多态调用子类实现的不同纯虚函数不会发生任何歧义,各调各的
//当在堆空间创建对象时如果使用父类指针,则需要把父类的析构函数写成虚析构函数这样delete
?在面向对象编程中抽潒类是一种只能定义类型,不能生成对象的类它是对一系列看上去不同,但是本质相同的具体概念的抽象最典型的的抽象类就是”图形”,三角形、矩形、梯形都是图形它们都具有边长、面积属性,”图形”类是对这系列的抽象
?程序设计中,我们可以定义一个表征图形的类然后具体图形继承该类。图形类即基类定义如下:
?实际上,只要是具体图形就有面积这个量但是对”图形”求面积是沒有任何意义的,只有在知道具体的图形类型之后才能求面积所以对”图形”来说,area()函数无法实现且不可让Shape生成对象(生成对象无意义),这就需要把Shape定义成一个抽象类:把area()函数声明为纯虚函数即可:
?总结什么是抽象类:其实在c++中并没有抽象类的概念,要实现抽象类则需要通过纯虚函数实现纯虚函数指的是只定义函数原型的成员函数。在c++的类中只要存在纯虚函数,那么该类就变成抽象类
?(1) 每个具體图形的求面积算法不一样,所以加上virtual关键字表明该函数是虚函数,在子类中重写时可以发生多态;
?(2) 为对Shape类求面积无意义所以加上”= 0”表明该函数声明为纯虚函数,不需要定义函数体
?(3) 抽象类不能生成对象,只能用作父类被继承子类必须实现纯虚函数的具体功能,在子类中父类的纯虚函数被实现后就变成虚函数,当然如果子类没有实现父类的纯虚函数,那么子类也是抽象类一个
?理解叻什么是抽象类后(类中含有纯虚函数),理解什么是接口就简单了c++中接口也是一种特殊的类,需要满足:
?(1) 类中没有定义任何成员变量
?(2) 類中所有成员函数都是公有且都是纯虚函数
?接口是一种特殊的抽象类所以抽象类具有只能被继承不能创建对象的特征它也具备。