C++中的继承

继承

在继承关系中存在两个类:基类(父类)、派生类(子类)

  1. 派生类拥有基类的所有特征
  2. 可以定义新的特征
  3. 对基类的一些特征进行重定义

继承分为单继承和多继承,单继承是指一个类只能有一个直接基类,多继承是指一个类可以有多个直接基类。

class <派生类名>: <继承方式> <基类名>{
     
	<成员说明表>
};

成员说明表:给出派生类中新定义的成员
继承方式:public,private, protected ,默认是private。继承方式决定了:基类成员变成派生类的什么成员;派生类的对象用户以及派生类的派生类对该派生类的基类成员的具有何种访问控制;

示例:

class bird{
     
	public:
		void fly(){
     cout<<"bird fly"<<endl;};//鸟会飞
		void walk(){
     cout<<"bird walk"<<endl;}//鸟会走
};

class penguin: public bird{
     
	public:
		void swim();//企鹅会游泳
		void fly(){
     cout<<"penguin can not fly"<<endl;}
		void walk(){
     cout<<"penguin walk"<<endl;}
};

int main(){
     
	penguin pg;
	pg.walk();
	pg.bird::walk(); //告诉编译器这是一个bird,则编译器会按照bird类看待walk()的名字 
	return 0;
}

派生类几点规定:

  1. 派生类拥有基类所有成员(基类的构造函数和赋值操作符重载函数除外)外,也可以具有新的成员。
  2. 派生类中可以给出新的成员,也可以对基类成员进行重定义。派生类的访问是对重定义成员的。
  3. 派生类成员的作用域嵌套在基类作用域中。基类的一个成员,在派生类中没有定义与其同名的成员,则该成员名在派生类的作用域内可见;否则,该成员在派生类的作用域内不可见,如果要使用之,必须用基类名受限;即使派生类中定义了域基类同名但参数不同的成员函数,基类的同名函数在派生类的作用域中也是不可见的。
  4. 定义派生类时一定要见到基类的定义。编译程序无法确定派生类对象需占多大内存空间、派生类对基类成员的访问是否合法等。
  5. 友元关系不能继承,需要显式指出。如果在派生类中没有显示说明, 基类的友元不是派生类的友元;如果基类是另一个类的友元, 而该类没有显式说明, 则派生类也不是该类的友元。
  6. 派生类不能直接访问基类的私有成员。必须要通过基类的非私有成员函数来访问基类的私有成员,即public成员(外部也能访问)以及protected成员(外部不能访问)。

继承方式的调整

任何继承凡是下,除了基类的private成员可以在派生类中分别调整其访问控制。

调整方式:

[(public:)|(protected:)|(private:)]
<基类名>::<基类成员名>

需要注意:

  1. 对基类中一个重载成员函数名的访问控制的调整,将调整基类中所有具有该名的重载函数;
  2. 派生类中如果定义了与基类中同名的成员函数,则在派生类中不能再对基类中的同名函数进行访问控制调整。

继承方式调整示例:

#include
using namespace std;

class bird{
     
public:
	void walk();
	void fly();	
};

class penguin: public bird{
     
private:
	bird::fly;	
};

int main(){
     
	penguin pg;
	pg.fly();//error,无法再访问 
}

你可能感兴趣的:(c++,c++)