欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++/java 继承类的多态详解及实例代码

程序员文章站 2024-03-06 17:52:56
c++/java 继承类的多态详解 学过c++和java的人都知道,他们二者由于都可以进行面向对象编程,而面向对象编程的三大特性就是封装、继承、多态,所有今天我们就来简单...

c++/java 继承类的多态详解

学过c++和java的人都知道,他们二者由于都可以进行面向对象编程,而面向对象编程的三大特性就是封装、继承、多态,所有今天我们就来简单了解一下c++和java在多态这方面的不同。

首先我们各看一个案例。

c++

//测试继承与多态
class animal {

public:
 char name[128];
 char behavior[128];

 void output() {
  cout << "animal" << endl;
 }

 void outputanimal() {
  cout << "father" << endl;
 }

 animal() {
  strcpy(name, "animal");
  strcpy(behavior, "call");
 }
};

class dog: public animal {

public:
 //子类定义一个和父类相同的属性
 char name[128];
 char sex;

 //子类重写父类方法
 void output() {
  cout << "dog" << endl;
 }

 void outputdog() {
  cout << "son" << endl;
 }

 dog() {
  strcpy(name, "dog");
  sex = 'm';
 }
};

以上两个类都很简单,我们来看一下其测试代码和结果。

/*
没有多态的情况下测试结果和java相同
 dog dog;
 cout << dog.name << endl;
 cout << dog.sex << endl;
 cout << dog.behavior << endl;
 dog.output();
 dog.outputanimal();
 dog.outputdog();

 //可通过如下方式访问父类的行为
 dog.animal::output();
*/

//多态的情况下:
 animal *dog = new dog;

 cout << dog->name << endl;
 cout << dog->behavior << endl;
 dog->output();
 dog->outputanimal();

//测试结果
animal
call
animal
father

可以看出所有的表现都是父类的行为,无论是相同的属性还是重写的方法。在这里需要说明一下,如果子类隐藏了父类的成员函数,则父类中所有同名的成员函数(重载的函数)均被隐藏。如果想要访问父类中被隐藏的函数,需要通过父类名称来访问(dog.animal::output();)。

在多态的情况下我们访问的都是父类的行为,那怎样才能访问到子类的函数呢?答案是通过定义虚函数来实现,这个我们后面的博文讲解。

现在我们在来看一下java的表现。

java

//父类
public class animal {

 public string name = "animal";
 public string behavior = "call";

 public void output() {
  system.out.println("animal");
 }

 public void outputanimal() {
  system.out.println("father");
 }
}

//子类
public class dog extends animal{

 public string name = "dog";
 public char sex = 'm';

 public void output() {
  system.out.println("dog");
 }

 public void outputdog() {
  system.out.println("son");
 }
}

子类也是定义了一个和父类相同的属性,同时也重写了父类的一个方法,我们看一下其测试方法和测试结果。

public static void main(string[] args) {

 animal dog = new dog();

 system.out.println(dog.name);
 system.out.println(dog.behavior);
 dog.output();
 dog.outputanimal();

}

//测试结果
animal//父类行为
call
dog//表现的是子类的行为
father

从这里可以看出,java和c++还是有区别的,java的属性表现的是父类的行为,但是重写的方法却是子类的行为,而c++全部都是父类的行为。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!