面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个
类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提
高执行效率的效果。
当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了
一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
派生类去继承基类,派生类会拥有所有基类的属性和行为
//格式:
//基类
class Base
{
};
/派生类
class Inhret : public Base
{
};
继承方式
public: 继承之后,原来是什么权限就是什么权限
基类public: 类外,派生类
基类private:派生类通过基类的非private成员访问
基类proteacted:派生类
protected:继承之后,原来是public的权限变为protected权限
private:继承之后,原来所有权限都会变成私有成员,但是原来非私有成员派生类是可以访问的
访问公共受保护的私人同一个类是的是的是的派生类是的是的没有外部的类是的没有没有
访问 public protected private
同一个类 yes yes yes
派生类 yes yes no
外部的类 yes no no
总结:protected和private继承的区别,在多次继承之后,private继承方式最初始的基类所有成员都需要接口才能访问
构造函数
顺序:
先构造基类,再构造派生类
多继承的情况:先继承的基类先构造
析构顺序,先构造的后析构
派生类给基类传参,必须使用初始化列表传参
一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生
列表来指定基类。
//多继承:
class A{};
class B{};
class C:public A, public B{};
//多重继承:
class A{};
class B:public A{};
class C:public B{};
//当存在多继承和多重继承时可能会发生歧义:
class A{};
class B:public A{};
class C: public A{};
class D: public B, public C{};h
继承代码示例
/*===============================================
* 文件名称:dog.cpp
* 创 建 者:
* 创建日期:2023年09月08日
* 描 述:
================================================*/
#include
#include
using namespace std;
class dog
{
private:
int leg;//
int tail;//尾巴
int head;//
string color;
public:
dog(int leg = 4 , int tail = 1 ,int head = 1,string color = "未知")
{
this->leg = leg;
this->tail = tail;
this->head = head;
this->color = color;
}
//叫
virtual void dog_bark()
{
cout<<"狗叫声?"<<endl;
}
//吃的
virtual void dog_eat()
{
cout<<" eat "<<endl;
}
//得到头
int get_head()
{
return head;
}
//得到腿
int get_leg()
{
return leg;
}
//得到尾巴
int get_tail()
{
return tail;
}
//得到颜色
string get_color()
{
return color;
}
//颜色
void set_color(string c)
{
color = c;
}
//
virtual ~dog()
{
}
};
//黑
class black_dog:public virtual dog
{
private:
int speed;
public:
black_dog(string color = "黑色", int speed = 11):dog(4,1,1,color)
{
this->speed = speed;
}
//获取速度
int get_speed()
{
return speed;
}
//获取颜色
string get_color_black()
{
return get_color();
}
//重写叫
void dog_bark() override
{
cout<<"黑狗,哇哇哇?"<<endl;
}
//吃的
void dog_eat() override
{
cout<<"黑 吃狗粮 "<<endl;
}
};
//白
class white_dog: public virtual dog
{
private:
string var;
string color ;
public:
white_dog( string var = "阿拉斯加" ,string color = "白色")
{
this->color = color;
this->var = var;
}
//得到种类
string get_var()
{
return var;
}
//设置颜色
void set_color_white(string c)
{
set_color(c);
}
//得到颜色
string get_color_white()
{
return get_color();
}
//重写叫
void dog_bark() override
{
cout<<"白狗,桀桀?"<<endl;
}
//吃的
void dog_eat() override
{
cout<<"白 吃狗粮 "<<endl;
}
};
//小狗
class pieddog:public black_dog , public white_dog
{
private:
int weight;
string name;
public:
pieddog(int weight = 10, string name = "花狗")
{
this->weight = weight;
this->name = name;
}
int get_weight()
{
return weight;
}
string get_name()
{
return name;
}
//重写叫
void dog_bark()
{
cout<<"狗,汪汪汪?"<<endl;
}
//吃的
void dog_eat()
{
cout<<" 吃狗粮 "<<endl;
}
};
int main()
{
cout<<"黑:"<<endl;
black_dog b;
cout<<"颜色"<<b.get_color_black()<<" 头:"<<b.get_head()<<"个"<<" 腿:"<<b.get_leg()<<"条 "<<" 尾巴:"<<b.get_tail()<<"条:"<<" 速度:"<<b.get_speed()<<endl;
b.dog_eat();
b.dog_bark();
cout<<endl;
cout<<"白:"<<endl;
white_dog w;
cout<<"颜色"<<w.get_color_white()<<" 头:"<<w.get_head()<<"个"<<" 腿:"<<w.get_leg()<<"条 "<<" 尾巴:"<<w.get_tail()<<"条:"<<" 种类:"<<w.get_var()<<endl;
w.dog_eat();
w.dog_bark();
cout<<endl;
cout<<"花:"<<endl;
pieddog g;
cout<<"名字"<<g.get_name()<<" 体重:"<<g.get_weight()<<" 头:"<<g.get_head()<<"个"<<" 腿:"<<g.get_leg()<<"条 "<<" 尾巴:"<<g.get_tail()<<"条:"<<" 种类:"<<g.get_var()<<endl;
g.dog_eat();
g.dog_bark();
cout<<endl;
return 0;
}