- 继承:是面向对象的一种共享机制
——一个类共享另一个类的数据和方法
被继承类:父类 基类
继承类 :子类 派生类
派生类继承基类的数据和方法 - 派生类在继承基类时,要继承基类的所有数据和方法
派生类组成:①从基类继承的
②派生类自定义的数据和方法 - 继承表示:①定义基类:class 基类名{
//基类定义;
};
②定义派生类:class 派生类名:继承权限 基类名{
//定义派生类自己的数据和方法;
}; - 对派生类而言,一定是先继承,再自定义
派生类的类体只表示派生类新加特性 - 继承权限:i:一个派生类要继承基类的所有数据和方法
ii:公有继承(public):派生类在继承基类成员时,不改变基类成员的访问权限
a>基类类外对象:访问基类公有
b>基类成员:可访问:公有可访问全部
受保护可访问受保护和私有
私有只能访问私有 - 由于基类不从派生类继承,所有基类只可访问基类成员,不可访问派生类成员
c>派生类类外对象:基类公有 派生类公有
派生类成员:派生类的public:除基类私有外都可访问
派生类的protected:可访问派生类的受保护,私有
基类的protected - 派生类继承基类私有,但不允许访问
——基类私有只可被基类成员访问
#include<iostream>
using namespace std;
class Base{
private:
int x,y;
public:
void fun()
{
cout<<"Base fun"<<endl;
}
void hun()
{
cout<<"Base hun"<<endl;
}
};
class Derived:public Base{
private:
int x,z;
public:
void gun()
{
cout<<"Derived gun"<<endl;
}
};
int main()
{
Base objB;
Derived objD;
objB.fun();
objB.hun();
objD.fun();
objD.hun();
objD.gun();
}
- 就近原则:i>基类和派生类中有同名的方法
ii>通过派生类对象调用同名方法时,就近原则优先生效,坚决调用派生类同名方法 - 过程:通过派生类对象调用方法时,系统先在派生类中查找是否有该方法:有,坚决调
无,在基类中查找 - 若派生类对象在调用基类和派生类的同名成员时:
直接调:objD.fun()——调派生类fun()
加基类作用域:objD.Base::fun()——调基类fun() - :: 类作用域运算符,最高优先级
#include<iostream>
using namespace std;
class Base{
public:
void fun()
{
cout<<"Base fun"<<endl;
}
void hun()
{
cout<<"Base hun"<<endl;
}
};
class Derived:public Base{
public:
void fun()
{
cout<<"Derived fun"<<endl;
}
void gun()
{
cout<<"Derived gun"<<endl;
}
};
int main()
{
Derived objD;
objD.fun();
objD.hun();
objD.gun();
objD.Base::fun();
}
- 就近原则优先于访问权限,参数匹配检测之前完成
派生类的同名方法中,若要调用基类同名方法,必须加基类作用域 - 指向派生类对象的指针:
①定义派生类指针:派生类名 *指针名;
②使派生类指针指向派生类对象:派生类指针名=&派生类对象名 / 派生类指针名=new 派生类名(实参)
③通过派生类指针引用方法:派生类指针名->方法名(实参);
#include<iostream>
using namespace std;
class Base{
public:
void fun()
{
cout<<"Base fun"<<endl;
}
void hun()
{
cout<<"Base hun"<<endl;
}
};
class Derived:public Base{
public:
void fun()
{
cout<<"Derived fun"<<endl;
}
void gun()
{
cout<<"Derived gun"<<endl;
}
};
int main()
{
Base *pb1=new Base();
Derived *pd1=new Derived();
Base *pb2;
Derived *pd2;
pb2=pd1;
pb1->fun();
pd1->fun();
pb2->fun();
}
- 赋值兼容规则:
基类指针可以指向派生类对象:基类指针=&派生类对象名 / 基类指针=new 派生类名(实参)
通过基类指针访问成员时,只可访问派生类从基类继承的成员
派生类指针不可指向基类对象