1、实现方法(class 派生:派生方式 父类1,派生方式 父类2…….)
class A
{
};
class B:public A ……
{
};
A称为父类(基类)
B称为子类(派生类)
2、派生方式:公有派生,保护派生,私有派生
C++不会选择继承,而是全部继承(除了构造函数和析构函数),只是引用受限
公有派生:父类公有(子类公有) 私有(私有) 保护(保护)
保护派生:父类公有(保护) 私有(私有) 保护(保护)
私有继承:父类公有(私有) 私有(私有) 保护(保护)
子类不能直接访问父类继承过来的私有成员(可通过父类提供的非私有接口访问)
参考代码
#include<iostream>
#include<string>
using namespace std;
class person
{
public:
person();
person(int,const char*,const char*);
void show();
private:
int id;
public:
string name;
protected:
string addr;
};
person::person():id(0)
{
this->name[0]='\0';
this->addr[0]='\0';
cout<<"初始化父类(默认)"<<endl;
}
person::person(int id,const char* name,const char*addr):id(id),name(name),addr(addr)
{
cout<<"初始化父类(带参)"<<endl;
}
void person::show()
{
cout<<"ID:"<<this->id<<" 姓名:"<<this->name<<" 地址:"<<this->addr<<endl;
}
class teacher:public person//共有继承person类
{
public:
teacher();
teacher(int id,const char*,const char*,const char*,float,const char*);
void display();
private:
string dept;
float salary;
string grade;
};
teacher::teacher(int id,const char* name,const char* addr,const char* dept,float salary,const char* grade):person(id,name,addr)//父类构造
{
this->dept=dept;
this->salary=salary;
this->grade=grade;
}
void teacher::display()
{
// cout<<"ID:"<<this->id<<" 姓名:"<<this->name<<" 地址:"<<this->addr<<endl;
this->show();//间接访问继承过来的父类私有成员
cout<<" 部门"<<this->dept<<" 薪水"<<this->salary<<" 年级"<<this->grade<<endl;
}
teacher::teacher():person()
{
cout<<"初始化鸡类"<<endl;
// this->person(); 构造函数没有被继承
}
int main()
{
// person a(123,"cmz","wuhan");
// a.show();
teacher b(123,"cmz","wuhan","研发部",8000,"3");
b.display();
b.show();
return 0;
}
3、初始化:既要初始化新增,又要初始化继承过来的数据,
父类只能通过初始化列表,而不能在函数体中(this->person(:))
若子类不显示构造父类部分,则编译器会默认添加调用默认构造函数。
构造:先父类再子类
析构:先子类,后父类(栈区特点)
4、重载:同一作用域下,同名函数但形参不同。
重写(覆盖):
函数: 父类和子类,只要函数名一样,(形参不管一样还是不一样)类似全局和局部,子类的方法会覆盖父类(子类优先),只是作用域被覆盖,原来的方法还存在,不是替换
变量:子类优先
二义性:一个子类中,父类和子类出现同名现象
解决方法:(调用时加上作用域)子类.作用域::成员
5、 父子之间的赋值
不同类型之间不能相互赋值,同类型之间可互相赋值,内存空间布局相同
子类赋值给父类(可以,子类一定有父类的一部分,空间相似:)
父类赋值给子类(失败)
只能由子类赋值给父类,不能由父类赋值给子类
子类=子类+父类