继承与派生

三种继承方式​​​​​​​​​​​​​​

​​​​​​​公有继承

#include<iostream>
#include<string>
using namespace std;

class Student{
public:
	Student(string s,int g,int a){//基类构造函数
		cout<<"调用基类构造函数"<<endl;
		name=s;grade=g;age=a;
	}
	void print(){
		cout<<"Student:"<<endl;
		cout<<"name="<<name<<endl;
		cout<<"grade="<<grade<<endl;
		cout<<"age="<<age<<endl;
	}
protected:
	string name;
	int grade;
private:
	int age;
};

class GraduateStudent:public Student{//公有继承:无法继承和访问age; 将name、grade继承为自己的保护成员; 将print函数继承为自己的公有成员
public:
	GraduateStudent(string s,int g,int a):Student(s,g,a){//调用基类的构造函数构造基类
		cout<<"调用继承类构造函数"<<endl;
	}
	void print1(){
		cout<<"GraduateStudent:"<<endl;
		cout<<"name="<<name<<endl;
		cout<<"grade="<<grade<<endl;
		//cout<<"age="<<age<<endl;//本句会报错,因为age是基类的私有变量,继承类中无法访问
	}
};

int main(){
	GraduateStudent g("Ouyang",95,21);//先调用基类构造函数,再调用继承类构造函数
	//cout<<g.name<<endl;//本句报错,因为name是基类中的保护成员,在基类和继承类之外均无法访问
	g.print();//print函数是基类的公有成员,故可以访问
	g.print1();
	return 0;
}

注意事项:
- 基类的私有成员,子类不可以访问
- 基类的保护成员,子类可以继承为自己的保护成员,在派生类可以访问,在外部不可以访问。
- 基类的公有成员,子类可以继承为自己的公有成员。在派生类可以访问,在外部也可以访问。

输出结果:

 保护继承

#include<iostream>
#include<string>
using namespace std;


class Student{
public :
    Student(string s, int g,int a){
        cout << "调用基类构造函数" << endl;
        name = s;
        grade = g;
        age = a;
    }
    void print(){
        cout << "Student:" << endl;
        cout << "name=" << name << endl;
        cout << "grade=" << grade<<endl;
        cout << "age=" << age << endl;
    }
    string name;
    int grade;
private:
    int age;
};

class GraduateStudent :protected Student{//保护继承:无法继承和访问基类的私有成员; 将基类的保护成员name、grade、print均继承为自己的保护成员
public:
    GraduateStudent(string s, int g, int a) :Student(s, g, a){   //调用基类的构造函数,构造基类
        cout << "调用继承类构造函数" << endl;
    } 
    void print1(){
        cout << "GraduateStudent:" << endl;                           
        cout << "name= " << name << endl;
        cout << "grade= " << grade << endl;
    }

};

int main(){
	Student s("putao",0,2);//基类成员:s
	s.print();
    GraduateStudent g("Ouyang", 95, 21);//继承类成员:g
    //g.print();//编译出错,print函数成为了继承类中的保护成员,故main函数中直接访问
    g.print1();
    return 0;
}

注意事项:

  • 基类公有成员,子类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问

  • 基类保护成员,子类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问

  • 基类私有成员,子类一样不可以访问基类的私有成员。

输出结果:

私有继承: 

(1) 基类公有成员,子类中继承为自己的私有成员,在派生类可以访问,在外部不可以访问。
(2). 基类保护成员,子类中继承为自己的私有成员,在派生类可以访问,在外部不可以访问。
(3) 基类私有成员,子类一样不可以访问基类的私有成员。

 三种继承方式的比较:

三种继承方式都不能访问上一级的私有成员。

公有继承:成员属性不变;保护继承:继承后的成员属性均为保护;私有继承:继承后的成员属性均为私有成员

这里写图片描述

为提醒类的独立性,我们希望通过调用基类的成员函数去初始化这些成员变量;故派生类是通过调用基类的构造函数,实现对成员变量的初始化。​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值