多态例子——Java和C++实现

来源:互联网 发布:张剑150篇怎么样 知乎 编辑:程序博客网 时间:2024/06/05 12:45

Java用关键字abstract修饰类名来定义一个抽象类,而C++只要在类中定义一个或多个纯虚函数(虚函数后加“ = 0”)就可使该类成为抽象类。

Java实现例子:


abstract class Pet{//抽象类protected String name;public abstract void enjoy();//抽象方法public String getName(){return name;}public void setName(final String name){this.name = name;}}class Dog extends Pet{private int furColor;public Dog(final String name, final int furColor){this.name = name;this.furColor = furColor;}public void enjoy(){//重写父类enjoy方法System.out.println("Wang!Wang!");}}class Cat extends Pet{private int eyeColor;public Cat(final String name, final int eyeColor){this.name = name;this.eyeColor = eyeColor;}public void enjoy(){//重写父类enjoy方法System.out.println("Miao~Miao~");}}class Lady{private String name;private Pet pet;public Lady(final String name, final Pet pet){this.name = name;this.pet = pet;}public void play(){pet.enjoy();//运行时动态绑定}public String getPetName(){return pet.getName();//编译时静态绑定}public void setPetName(final String name){ pet.setName(name);//编译时静态绑定}public void display(){System.out.print(name + " " + pet.getName() + " ");}}public class TestPoly{public static void main(String[] agrs){Lady lady1 = new Lady("MiFei" ,new Dog("XiaoWang", 1));Lady lady2 = new Lady("FangFang" ,new Cat("XiaoMi", 2));lady1.display();lady1.play();lady2.display();lady2.play();lady1.setPetName("WangCai");lady2.setPetName("DouLaAMeng");lady1.display();lady2.display();}}

C++实现:

#include <iostream>#include <string>using namespace std;class Pet{//抽象基类public:virtual void enjoy() const = 0;//纯虚函数string getName() const{return name;}void SetName(const string &name){this->name = name;}protected:string name;};class Dog: public Pet{public:Dog(const string &name, const int furColor){this->name = name;this->furColor = furColor;}void enjoy() const{//重写父类虚函数enjoycout << "Wang!Wang!" << endl;}private:int furColor;};class Cat: public Pet{public:Cat(const string &name, const int eyeColor){this->name = name;this->eyeColor = eyeColor;}void enjoy() const{//重写父类虚函数enjoycout << "Miao~Miao~" << endl;}private:int eyeColor;};class Lady{public:Lady(const string &name, Pet *const pet){this->name = name;this->pet = pet;}void play() const{pet->enjoy();//运行时动态绑定}string getPetName() const{return pet->getName();//编译时静态绑定}void setPetName(const string &name){pet->SetName(name);//编译时静态绑定}void display() const{cout << name << " " << pet->getName() << " ";}private:string name;Pet *pet;};int main(void){Lady *lady1 = new Lady("MiFei", new Dog("XiaoWang", 1));Lady *lady2 = new Lady("FangFang", new Cat("XiaoMi", 2));lady1->display();lady1->play();lady2->display();lady2->play();lady1->setPetName("WangCai");lady2->setPetName("DouLaAMeng");lady1->display();lady2->display();cout << endl;delete lady1, lady2;lady1 = lady2 = 0;return 0;}



原创粉丝点击