封装一个动物的基类,类中有私有成员:姓名,颜色,指针成员年纪
再封装一个狗这样类,共有继承于动物类,自己拓展的私有成员有:指针成员:腿的个数(整型 int count),共有成员函数:会叫:void speak()
要求:分别完成基类和派生类中的:构造函数、析构函数、拷贝构造函数、拷贝赋值函数
eg : Dog d1;
Dog d2(.....);
Dog d3(d2);
d1 = d
#include <iostream>
using namespace std;
class Animals//定义一个类,里面有名字,颜色和年龄
{
private:
string name;
string color;
int *age;
public:
Animals()
{
cout<<"父类无参构造"<<endl;
};
Animals(string name,string color,int age):name(name),color(color),age(new int(age))
{
cout<<"父类有参构造"<<endl;
}
Animals(const Animals &other):name(other.name),color(other.color),age(new int(*other.age))
{
cout<<"父类拷贝构造"<<endl;
}
Animals &operator=(const Animals &other)
{
if(this!=&other)
{
name=other.name;
color=other.color;
age=new int(*age);
}
cout<<"父类拷贝赋值函数"<<endl;
return *this;
}
~Animals()
{
delete age;
cout<<"父类析构函数"<<endl;
}
};
class Dog:public Animals//定义子类继承父类的属性
{
private:
int *tag;
public:
Dog()
{
cout<<"子类的无参构造函数"<<endl;
};
Dog(string name,string color,int age,int tag):Animals(name,color,age),tag(new int (tag))
{
cout<<"子类有参构造"<<endl;
}
Dog(const Dog &other):Animals(other),tag(new int(*other.tag) )
{
cout<<"子类拷贝构造"<<endl;
}
Dog &operator=(const Dog &other)
{
if(this!=&other)
{
Animals::operator=(other);
tag=new int(*tag);
}
cout<<"子类拷贝赋值函数"<<endl;
return *this;
}
~Dog()
{
delete tag;
cout<<"子类析构函数"<<endl;
}
};
int main()
{
Dog dog("豆丁","白色",1,4);
Dog dog1=dog;
Dog dog2;
dog2=dog1;
return 0;
}
以下是一个简单的比喻,将多态概念与生活中的实际情况相联系:
比喻:动物园的讲解员和动物表演
想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员,他会为每种动物表演做简单的介绍。
在这个场景中,我们可以将动物比作是不同的类,而每种动物表演则是类中的函数。而讲解员则是一个基类,他可以根据每种动物的特点和表演,进行相应的介绍。
具体过程如下:
定义一个基类 Animal,其中有一个虛函数perform(),用于在子类中实现不同的表演行为。
#include <iostream>
using namespace std;
class Animal//定义基类
{
private:
int id;
public:
Animal(){};
virtual void perform()
{
cout<<"我是讲解员"<<endl;
}
};
class Tiger:public Animal//老虎是基类的派生
{
private://里面有名字和年龄两个成员数据
string name;
int age;
public:
Tiger(string name,int age):name(name),age(age)
{};
void perform()//重写行为
{
cout<<"这是一只老虎"<<name<<",年龄是"<<age<<"他现在正在玩球"<<endl;
}
};
class Panda:public Animal//定义熊猫是基类的派生
{
private://数据成员
string name;
int age;
public:
Panda(string name,int age):name(name),age(age)//初始化
{};
void perform()//调用产生的行为
{
cout<<"这是一只熊猫"<<name<<",年龄是"<<age<<"他现在正在吃竹子"<<endl;
}
};
int main()
{
Tiger tiger("黄黄",1);
Animal *p=&tiger;
p->perform();
Panda panda("黄黄",1);
p=&panda;
p->perform();
return 0;
}