一、c++编程实现:
封装一个动物的基类,类中有私有成员:姓名,颜色,指针成员年纪;
再封装一个狗这样类,共有继承于动物类,自己拓展的私有成员有:指针成员:腿的个数(整型 int count),公有成员函数:会叫:void speak()
要求:分别完成基类和派生类中的:构造函数、析构函数、拷贝构造函数、拷贝赋值函数。
eg : Dog d1;
Dog d2(.....);
Dog d3(d2);
d1 = d3;
代码:
#include <iostream>
using namespace std;
//封装动物类
class Anim
{
private:
string name;
string color;
int *age;
public:
Anim()
{
cout << "anim::无参构造" << endl;
}
//有参构造函数 初始化列表
Anim(string n,string c,int age):name(n),color(c),age(new int(age))
{
cout << "anim::有参构造函数" << endl;
}
//析构函数 析构前释放堆区指针成员
~Anim()
{
delete age;
cout << "anim::析构函数" << endl;
}
//拷贝构造函数 深拷贝
Anim(const Anim &other):name(other.name),color(other.color),age(new int(*other.age))
{
cout << "anim::拷贝构造函数" << endl;
}
//拷贝赋值函数 深拷贝
Anim &operator=(const Anim &other)
{
if(this != &other)
{
name = other.name;
color = other.color;
age = new int(*other.age);
}
cout << "anim::拷贝赋值函数" << endl;
return *this;
}
};
//封装 Dog 类 公有继承Anim
class Dog:public Anim
{
private:
int *legs;
public:
Dog()
{
cout << "Dog::无参构造" << endl;
}
//有参构造 初始化列表 先初始化基类 调用基类的构造函数即可
Dog(int legs,string name,string color,int age):Anim(name,color,age),legs(new int(legs))
{
cout << "Dog::有参构造函数" << endl;
}
//析构函数 先释放堆区空间
~Dog()
{
delete legs;
cout << "Dog::析构函数" << endl;
}
//拷贝构造函数 深拷贝
Dog(const Dog &other):Anim(other),legs(new int(*other.legs))
{
cout << "Dog::拷贝构造" << endl;
}
//拷贝赋值函数 深拷贝
Dog &operator=(const Dog &other)
{
if(this != &other)
{
Anim::operator=(other);
legs = new int(*other.legs);
}
cout << "Dog::拷贝赋值函数" << endl;
return *this;
}
void speak()
{
cout << "汪汪汪~" << endl;
}
};
int main()
{
Dog d1;//实例化d1对象 不初始化 走无参构造
Dog d2(4,"xiaohuang","yellow",3);//实例化d2 并初始化
Dog d3(d2);//实例化d3 并使用d2给其初始
d1 = d3; //将d3 赋值给d1
d1.speak();
d2.speak();
d3.speak();
return 0;
}
运行:
二、 c++程序实现:
以下是一个简单的比喻,将多态概念与生活中的实际情况相联系:
比喻:动物园的讲解员和动物表演
想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员,他会为每种动物表演做简单的介绍。
在这个场景中,我们可以将动物比作是不同的类,而每种动物表演则是类中的函数。而讲解员则是一个基类,他可以根据每种动物的特点和表演,进行相应的介绍。
具体过程如下:
定义一个基类 Animal,其中有一个虛函数perform(),用于在子类中实现不同的表演行为。
代码:
#include <iostream>
using namespace std;
//封装一个 讲解动物 类
class Explain_animal
{
public:
Explain_animal() {}
virtual void show() = 0;
};
//封装一个 狮子 类 共有继承Explain_animal
class Lion:public Explain_animal
{
private:
string name;
public:
Lion() {}
Lion(string name):name(name)
{}
//重写虚函数
void show()
{
cout << name << ":狮吼" << endl;
}
};
//封装一个 大象 类 共有继承Explain_animal
class Elephant:public Explain_animal
{
private:
string name;
public:
Elephant() {}
Elephant(string name):name(name)
{}
//重写虚函数
void show()
{
cout << name << ":大象吸水" << endl;
}
};
//封装一个 猴子 类 共有继承Explain_animal
class Monkey:public Explain_animal
{
private:
string name;
public:
Monkey() {}
Monkey(string name):name(name)
{}
//重写虚函数
void show()
{
cout << name << ":猴子骑车" << endl;
}
};
int main()
{
//狮子类实例化一个对象 并初始化
Lion l1("狮王辛巴");
//使用基类指针 指向狮子子类对象l1
Explain_animal *p =&l1;
p->show();//展开狮子子类功能
//大象类实例化对象
Elephant e1("象王白象");
p = &e1;
p->show();
//猴子实例化对象
Monkey m1("猴王吉吉");
p = &m1;
p->show();
return 0;
}
运行:
思维导图: