Java中的接口抽象方法与C++中的抽象类纯虚函数
接着我的文章当中C++静态绑定和动态绑定的例子.
一个简单的形状类:
如下:
class Figure{
public:
Figure(){
_name = "Figure";
}
virtual string getName() const{
return _name;
}
virtual double area()const = 0;
private:
string _name;
};
形状表示一种抽象的概念.所以如果是在Java中的话Figure应该定义为一个抽象类.类名前用abstract来修饰.
在C++中,抽象函数不是直接用abstract关键字来指定的.
在C++中包含有纯虚函数的类的被称为抽象类.这个跟Java中抽象方法有相同点.
在C++中定义纯虚函数格式如下:
virtual<返回值类型><函数名>(<形式参数表>)=0;
即纯虚函数的定义是在虚函数定义的基础上,再让函数等于0即可.这只是一种表示纯虚函数的标志.而不是指它的返回值是0.
上面的例子中.对于对一个形状的面积来讲确实是一个无法确定的概念,就好像说
如果调用这个Figure类的求面积方法area()的结果是未定义的一样.
因为只有针对具体的形状如圆,三角形.矩形等才有意义.
与C++的抽象类中纯虚函数最对应的是Java的抽象类中的抽象方法.
在Java中如果一个类中有一个方法是抽象的,那么这个类也就是抽象的.需要用abstract修饰类名.(除非是一个特殊的类型如枚举).
不管是对于 C++还是Java而言,抽象类中抽象方法(C++中的纯虚函数)
Java中方法修饰中的abstract与private,static,final关键字是不互斥的.(道理显然)
显然可见的是,抽象类不能实例化,主要是因为调用抽象类中的抽象方法是没有意义的.
在Java中下面的代码有出现编译错误,原因就是ColoredPoint类中的super关键字试图访问Point类中的抽象toString()方法.
abstract class Point{
int x,y;
public abstract String toString();
}
class ColoredPoint extends Point{
int color;
@Override
public String toString() {
return super.toString()+":color "+color;
}
}
但是在抽象类中的方法中可以调用抽象方法:
如下测试所示(下面程序运行时没有任何输出,原因可能是因为move()方法调用的toString()是Point类中的toString()而不是ColoredPoint类中的toString().
package me.banxi.oo;
abstract class Point{
int x,y;
public abstract String toString();
void move(int x,int y){
toString();
}
}
class ColoredPoint extends Point{
int color;
@Override
public String toString() {
return ":color "+color;
}
}
public class TestAbstractTypeMethod {
public static void main(String[] args) {
ColoredPoint cPoint = new ColoredPoint();
cPoint.move(10, 9);
}
}
分享到:
相关推荐
#### 纯虚函数与抽象类 在C++中,**纯虚函数**是一种特殊的虚函数,它没有默认实现,必须由派生类提供具体的实现。纯虚函数通过在声明时添加`= 0`来标记。一个包含至少一个纯虚函数的类被称为**抽象类**,抽象类不...
Java中的抽象类和抽象方法是通过在方法声明前添加`abstract`关键字来定义的。抽象方法没有函数体,必须在抽象类中声明,抽象类可以包含非抽象方法(有函数体的方法)。同样,如果一个类包含至少一个抽象方法,那么这...
C++则通过纯虚函数实现类似接口的概念,但其语法和使用方式与接口有所不同。 总结起来,Java、C#和C++在继承、覆盖、多态和抽象类方面都有相似的基本原理,但在具体实现和使用上存在差异。Java倾向于安全性,C#兼顾...
在C++中,抽象工厂通常通过接口(纯虚函数)来定义,这些接口代表了不同类型的工厂,每个工厂负责创建一类相关的产品。例如,我们可以有一个`IFactory`接口,包含创建产品A和产品B的纯虚方法。然后,针对具体的产品...
在C++中,我们通常通过定义接口(纯虚函数)来实现抽象工厂。例如,我们可以创建一个`AbstractFactory`基类,其中包含创建具体产品的抽象方法: ```cpp class AbstractFactory { public: virtual ProductA* ...
这意味着,每个继承自接口的类都必须实现所有纯虚函数,否则该类也将成为一个抽象类,无法实例化。 3. **使用接口**:在代码中,我们可以使用指向接口类型的指针或引用操作任何实现了该接口的类的对象。这得益于C++...
总之,C++通过抽象类、纯虚函数、多重继承等手段实现了接口的概念,尽管这些机制比某些支持接口的语言更为复杂,但它们赋予了C++更大的灵活性和可定制性。在实际开发中,理解并熟练运用这些机制是成为一名优秀的C++...
- **C++**:由于C++不支持接口,但支持抽象类,可以用纯虚函数(即只有声明没有实现的成员函数)来模拟接口。多个接口可以通过多重继承来模拟。 ```cpp class Interface { public: virtual ~Interface() = ...
虚函数和纯虚函数是面向对象编程中的两个关键概念,主要在C++和Java中发挥作用。本文将深入探讨这两种函数的定义、用途以及它们在两种语言中的差异。 首先,让我们来理解虚函数。在C++中,虚函数是通过在基类中使用...
首先,C++本身并不直接支持像Java或C#那样的接口定义,但是我们可以通过抽象类(abstract class)来模拟接口的概念。一个抽象类包含至少一个纯虚函数,这使得它不能被实例化,而只能作为其他类的基类。下面是一个...
5. 抽象:C++的抽象类通过包含纯虚函数来定义,没有实例化抽象类的权限。 虽然Java和C++在面向对象特性上有相似之处,但实现细节和使用习惯上存在差异。Java更注重安全性和跨平台,而C++则倾向于性能和灵活性。在...
这种设计模式类似于Java中的接口,但C++的抽象类还可以包含非纯虚函数和数据成员。 ```cpp class AbstractBase { public: virtual void pureVirtualFunc() = 0; // 纯虚函数,没有定义 }; class ConcreteDerived ...
在C++中,我们可以创建纯虚函数来定义抽象类,而在Java中,未实现的抽象方法则使一个类成为抽象类。 在JNI环境下,Java代码可以调用C/C++编译生成的动态链接库(.so文件),反之亦然。在"klogtest1.zip"中,可能...
接口定义了一组纯虚函数(抽象方法),任何实现了该接口的类都必须提供这些方法的具体实现。这意味着在Java中,一个类可以实现多个接口,从而达到类似于多重继承的效果。 - **示例**:以下是一个简单的Java接口示例...
C++通过虚函数(virtual)和纯虚函数(pure virtual)实现多态,而Java通过方法重写(Override)和抽象类(abstract class)及接口来实现。Java的多态性更为严格,所有非私有的方法默认都是虚方法,而C++则需要明确...
虚函数、纯虚函数和抽象类在C++中用于实现多态性。虚函数允许子类覆盖父类的方法,纯虚函数使得类成为抽象类,不能被实例化,通常作为接口使用。 实时操作系统(RTOS)是能保证任务在规定时间内完成的操作系统,常...
C++的抽象类至少包含一个纯虚函数,且抽象方法与纯虚函数相关联。 13. `final`类:Java的`final`类不能被继承,而C++没有类似的概念,但可以用`=0`声明纯虚函数来阻止继承。 总之,Java和C++虽然在语法上有许多...
6. **多态与接口**:虚函数使得C++可以模拟类似Java中的接口,虽然C++没有内置接口类型,但通过纯虚函数的抽象类可以实现类似功能。 7. **成员访问权限与虚函数**:虚函数可以是公有、保护或私有的,但通常为了使...