什么是虚函数?
虚函数定义:如果在基类中将某个函数指定为并且派生类中有另外一个该函数的定义,则编译器将知道我们不想静态连接该函数。
虚函数和纯虚函数的区别:声明方式不同、实现方式不同、覆盖方式不同、特性不同、用法不同。声明方式不同 虚函数可以在类中声明,也可以在类的外部声明,编译器会自动将它们转换为虚函数;但是纯虚函数只能在类中声明,而不能在类的外部声明。
虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。
虚函数是用于后期动态绑定的,可以实现运行期多态。说白了就是一个函数指针,在运行的时候才确定最终要调用的目标。
什么是纯虚类
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
在C 中没有这么一个定义,除非是指的java中的抽象方法。在java中,只含有抽象方法的类叫做接口,含有抽象方法的类是抽象类。
在定义和实现COM接口时,纯虚函数有不可替代的作用。举个例子,可能有些牵强,但是能说明问题。
简单地说,虚函数就是在类的继承中可以被改写函数体(专业术语叫“重载”)的函数!
不要因为暂时没用就可以不学,多态就是通过虚函数来实现的,而正因为有多态,C 才由“基于对象”变成“面向对象”的,这是精华!
lz的理解还是有些出入。虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是:(1)纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。(2)包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。2. 虚函数的引入主要是为了实现多态,这部分内容是c 的精髓。
什么是虚函数和纯虚函数,有什么区别?
虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是: (1)纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。
虚函数的作用是“运行时多态”和重载,父类中提供虚函数的实现,为子类提供默认的函数实现;子类可以重写父类的虚函数实现子类的特殊化。虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstractclass),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。
构造函数不能是虚函数,更不能是纯虚函数。
实函数(Non-virtual Function)和虚函数(Virtual Function)是面向对象编程中的两个概念,它们在继承和多态性方面有所区别。
一方面,从语法上说是不清晰的,你的类的使用者在在看到你的类的定义的时候无法确定哪些函数是没有提供实现的虚函数,而如果你写成纯虚函数就非常明确,一眼就可以看出来。
虚函数和纯虚函数有以下所示方面的区别 (1)类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样的话,这样编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。
虚函数和纯虚函数的两个基础小问题
纯虚函数就是“强制”要求在派生出具体类的时候 必须定义出的函数,否则该派生类就无法定义具体对象 而虚函数则可重新定义也可以不重新定义
--说得对。
而仅仅站在使用的角度去说,虚函数和纯虚函数都可以实现多态的功能。
--说得对。
派生类如果继承了抽象基类中的纯虚函数,而在该派生类中没有对此纯虚函数进行定义 则该派生类扔为抽象类 不能用它实体定义对象
--说得对。
我的问题是:该派生类继承过来的纯虚函数在这个派生类中扔然为纯虚函数么??????
--说得对。
书上说不是...除非重新声明成纯虚函数...那是什么?虚函数??我又没有在这个派生类中具体定义继承过来的这个纯虚函数 为什么就不是纯虚函数了呢????
--其实,如果你不打算在某个派生类里实现基类的纯虚函数,那你最好连声明都别声明。如果声明了,那就加上=0。
如果不声明=0,编译器会将它视为非纯虚函数。
例如,基类Base有纯虚方法void Fun()=0
class C1: public Base
{
public: void Fun(); // 不写=0,也不写实现。
}
class C2: public C1
{
public: void Fun(){return;} //有实现了
}
这时你将无法实例化C2,因为C1的非纯虚函数没有实现,将产生连接错误。
Base *p = new C2;
C1 *p1 = new C2;
C2 *p2 = new C2;
这些都无法连接成功。