虚函数和抽象函数的区别

虚函数与抽象函数

虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写
抽象函数是没有代码,子类继承后一定要重写

  • 在一个类中用虚函数:
    是因为在超类中有实际代码的方法,但明确允许子类可以作重写
    而且当子类重写后,可以用子类实例超类;如果这样,超类变量调用虚函数时,执行的是子类的方法
  • 在一个类中用抽象函数
    是在写超类时不确定函数的代码,让子类去实现
    抽象函数没有方法体。

简单来说虚函数(Virtual)已经包含了也必须包含默认的实现,所以在派生类中可以重新实现也可以不实现这些虚函数。 抽象函数(abstract)没有提供默认实现,所以在派生类中必须实现这些抽象函数。

与Java的接口比较

java接口中的函数类似于抽象函数,也不提供默认实现,实现接口的类也必须实现接口全部的函数。

java接口可用于继承,即类只能从一个类继承,但可同时实现多个接口。

时间: 2024-10-24 09:30:44

虚函数和抽象函数的区别的相关文章

虚函数和抽象函数

虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写   抽象函数是没有代码,子类继承后一定要重写 在一个类中用虚函数:   是因为在超类中的有实际代码的方法,但明确允许子类可以作重写   而且当子类重写后,可以用子类实例超类:如果这样,超类变量调用虚函数时,执行的是子类的方法       在一个类中用抽象函数   是在写超类时不确定函数的代码,让子类去实现   抽象函数没有方法体. 简单来说虚函数(Virtual)已经包含了也必须包含默认的实现,所以在派生类中可以

MFC 虚函数与消息映射区别

初学MFC添加函数时,总是纠结于是 Add  windows message handler or Add virtual function 说到底不理解MFC中虚函数与消息处理函数的设计区别 本人理解:虚函数是层层继承的,子类Add virtual function只是去改写相应功能.虚函数一般都是程序框架必须调用的,子类没有改写就会默认调用基类的. 而消息映射只在相应类中添加自己感兴趣的处理函数,不存在继承性.所以没必要把windows消息映射函数设计成虚函数.有需要时程序才会执行这些操作.

JAVA – 虚函数、抽象函数、抽象类、接口

1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为.如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数 PS: 其实C++和Java在虚函数的观点大同小异,异曲同工罢了. 2. Java抽象函数(纯虚函数) 抽象函数或者说是纯虚函数的存在是为了定义接口. C++中纯虚函数形式为:virtual void print(

虚函数、抽象函数以及接口的区别

抽象函数: 1,使用abstract关键字声明 2,强制继承者重写override,声明时不提供自身的实现 3,抽象类不能被实例化 4,抽象方法不提供自身的实现,并且强制子类重写 虚函数: 1,允许被重写,但不强制要求.声明时提供其自身实现 接口(interface) 1,接口就是协议,其声明的成员(属性,方法,事件和索引器)必须由其继承的类实现.接口不能直接被实例化. 虚方法与抽象方法的区别在于,虚方法提供自身的实现,并且不强制要求子类重写:而抽象方法不提供自身的实现,并且强制子类重写. 抽象

c# 基础(重写与覆盖:接口与抽象,虚函数与抽象函数)

总结 1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改). 2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能:而覆盖不会,仍然调用父类功能. 3:虚方法.实方法都可以被覆盖(new),抽象方法,接口 不可以. 4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以. 5:重写使用的频率比较高,实现多态:覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候. 6:关键字:vi

虚函数和纯虚函数的作用与区别

http://blog.csdn.net/xwpc702/article/details/8670025 虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数.class Cman{public:virtual void Eat(){……};void Move();private:};class C

C++中虚函数和纯虚函数的作用与区别-详解

虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){--}; void Move(); private: }; class CChild : public CMan { public: virtual void

C#虚函数和接口的区别

接口只能声明不能实现,虚函数可以. 接口:对外提供可以访问的函数叫接口.虚函数不需要被强制重写,其本身含有实现部分. 抽象类:指派了派生类必须实现的函数(纯虚函数),不然编译不通过. 虚函数的限制:    1.虚函数仅适用于有继承关系的类对象,   所以只有类的成员函数才能说明为虚函数.      2.静态成员函数不能是虚函数.      3.内联函数不能是虚函数.      4构造函数不能是虚函数.      5.析构函数可以是虚函数. 接口可以有静态成员.嵌套类型.抽象.虚拟成员.属性和事件

第二章 C#继承&继承类型&虚函数&抽象类&抽象函数&抽象方法&隐藏方法

继承:实现继承,接口继承. C#不支持多实现继承,支持多接口继承 public class Class4:Class3,IInterface1,IInterface2 { } 虚方法:virtual 基类中声明virtual方法,在派生类中可以重写,并且调用的时候总是调用重写的方法. public class Class1 { public virtual void A() { Console.WriteLine("Class1.A"); } public void B() { Con