SV/C++/Java/C#/Pyton有关虚函数/抽象函数/抽象类/接口的总结

一、SystemVerilog

接口 interface/virtual interface

虚函数/抽象方法/抽象Task virtual

纯虚函数/方法 pure virtual

继承  implements(接口类) extends(抽象类和普通类)

抽象类 virtual class

1)抽象类为子类设置prototype

2)抽象类不可以被实例化,只可以被继承

3)在抽象类中,可以只包含方法的原型,可以没有实现,就是一个方法的声明

来自 <systemverilog学习 ---- 类(完结)_systemverilog 类-CSDN博客>

接口类 interface class,方法全为纯虚函数

来自 <Systemverilog interface class_system verilog interface class-CSDN博客>

二、C++

虚函数 virtual

纯虚函数 virtual xxx = 0

抽象类

1)最少具有一个纯虚函数。

2)可以有实现的方法。

3)可以进行变量定义。

4)可以继承抽象类而不实现抽象方法。

5)当试图创建一个功能的多个版本时,当创建的对象之间存在某种关系时,我们使用抽象类。

来自 <C++ 接口和抽象类 - 知乎>

接口

1)所有的函数必须被声明为纯虚函数。

2)没有变量的声明。

3)实现接口的类必须实现接口的所有方法。(实现接口的类必须实现接口的所有方法 类实现接口,必须实现接口的全部方法么?_实现类必须实现接口的所有方法吗-CSDN博客

4)当实现的功能彼此不相关时,创建的每个对象都是独立的,我们使用接口

来自 <C++ 接口和抽象类 - 知乎>

三、JAVA

继承  implements(接口) extends(抽象类和普通类)

抽象方法 abstract 只有声明,而没有具体的实现

覆写 @override

抽象类 如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用 abstract 关键字修饰,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

1)抽象方法必须为 public 或者 protected(因为如果为 private,则不能被子类继承,子类便无法实现该方法),默认情况下默认为 public。

2)抽象类不能用来创建对象;

3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为 abstract 类。

4)抽象类和普通类一样,同样可以拥有成员变量和普通的成员方法

5)可以直接在抽象类中添加具体的实现,子类可以不进行变更

接口 interface 尽管Java的接口中可以有变量的定义,但是变量也是会被finalstatic修饰。

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

5)如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

来自 <深入理解 Java 的接口和抽象类 | 菜鸟教程>

虚函数 JAVA没有单独的虚函数,但是有对应的多态,所以可以认为普通函数就是虚函数。

四、Python

抽象函数 使用ABC模块的@abstractmethod以及pass来描述

五、C#

虚函数/方法 virtual

1)虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项;

2)虚方法不是只能在抽象类中声明也不必要在派生类中重写;

3)包含虚方法的类可以实例化

抽象函数/方法 abstract

1)抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;

2)抽象方法只能在抽象类中声明,  抽象方法必须在派生类中重写(跟接口类似);

3)包含抽象方法的类不能实例化

抽象类 abstract class  如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的

1)抽象类无法实例化。

2)抽象类可以包含抽象方法和访问器。

3)由于两个修饰符的含义相反,因此无法使用密封的(C#Reference)修饰符来修改抽象类。Sealed修饰符可防止类被继承,而abstract修饰符则需要继承一个类。

4)抽象方法必须定义在抽象类中,抽象类也可以定义非抽象方法。

5)因为抽象方法声明不提供任何实际实现,所以没有方法主体;方法声明仅以分号结尾,并且签名后没有花括号({})。

原文链接: C# 抽象类,虚方法,接口_c# 子类必须实现-CSDN博客

覆写 override

1)重写基方法必须具有与override方法相同的签名。

2)override声明不能更改virtual方法的可访问性,且override方法与virtual方法必须具有相同级别访问修饰符。

3)不能用new、static、virtual修饰符修改override方法。

4)重写属性声明必须指定与继承的属性完全相同的访问修饰符、类型和名称。

5)重写的属性必须是virtual、abstract或override。

6)不能重写非虚方法或静态方法。

7)父类中有abstract,那么子类同名方法必定有override,若父类中有 virtual方法,子类同名方法不一定是override,可能是overload。

8)override必定有父子类关系。

原文链接: C#关键字之override详解_public override void-CSDN博客

接口 Interface

1)不能实例化;

2)包含未实现的方法声明;不允许使用 public、private、protected、internal 访问修饰符。不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段。

3)派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

4)接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员。

来自 <C#抽象类、接口、虚函数和抽象函数_c#接口虚表-CSDN博客>

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值