C++继承
继承是面向对象设计中很重要的一个环节,当要定义一个类时,但是已经存在一个类成员或者类成员函数都是你需要的,那么你再写一个类就会花掉大量功夫,所以引出继承的概念。
继承——就是在已有类的基础上新建一个类,这个类可以继承基类的成员或者成员函数。
那么什么是基类呢?基类就是已有的类,也叫父类新创建的那个类叫做派生类,也叫子类。
下面来看看一段代码:
#include<iostream>
using namespace std;
//定义一个shape类
class Shape {
public:
void setWidth(int w);
void setHeight(int g);
protected:
int width;
int height;
};
void Shape::setWidth(int w) {
width = w;
}
void Shape::setHeight(int g) {
height = g;
}
//定义一个rectangle继承Shape类
class Rectangle : public Shape {
public :
int getArea();
};
int Rectangle::getArea() {
return width * height;
}
int main()
{
Rectangle ret; // 一个对象
ret.setWidth(10);
ret.setHeight(10);
cout << ret.getArea() << endl;
return 0;
}
分析代码:
先是定义了一个Shape类,然后又定义了一个Rectangle类去继承Shape类,注意继承的写法:
class Rectangle : public Shape{
// 内容
}
可以看到写了一个 public ,表明是 public 类型的继承。
问题又来了,那是不是有 protected 和private 类型的继承呢?
答案是肯定的。
下面来分析分析三种继承方式的区别:
public :派生类可以访问基类的公有和保护成员,但是不能访问私有成员!
protected : 派生类可以继承基类的公有和保护成员,将其变成自己的保护成员!
private : 将基类的公有和保护成员变成自己的私有成员!
上面就是三种继承方式,可以看出,派生类可以访问基类的公有成员和保护成员,私有成员神圣不可侵犯!
还要注意,一个派生类继承了所有的基类方法,但下列情况除外:
基类的构造函数、析构函数和拷贝构造函数。
基类的重载运算符
基类的友元函数
又会有疑问了,什么是重载运算符,什么是友元函数?
这个后面再说。
先来分析继承的三种方式的特点,结合代码来分析。
继承的特点
先来看看一个重要的归纳:
(1) private成员只能被本类成员和友元访问,不能被其他访问。
(2) protected成员可以被派生类访问。
public继承
先看下面一段代码
#include<iostream>
#include<assert.h>
using namespace std;
class A{
public:
int a;
A(){
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun(){
cout << a << endl; //正确
cout << a1 << endl; //正确
cout << a2 << endl; //正确
cout << a3 << endl; //正确
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
class B : public A{
public:
int a;
B(int i){
A();
a = i;
}
void fun(){
cout << a << endl; //正确,public成员
cout << a1 << endl; //正确,基类的public成员,在派生类中仍是public成员。
cout << a2 << endl; //正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。
cout << a3 << endl; //错误,基类的private成员不能被派生类访问。
}
};
int main(){
B b(10);
cout << b.a << endl;
cout << b.a1 << endl; //正确
cout << b.a2 << endl; //错误,类外不能访问protected成员
cout << b.a3 << endl; //错误,类外不能访问private成员
system("pause");
return 0;
}
来分析代码,复习一下,public继承的内容是啥:基类的public和protected成员在派生类中变成派生类的public成员 和 protected 成员。
然后来看代码,先是定义了一个A类,里面的构造函数为4个变量赋值,没毛病吧,注意变量的类型有不相同,在A类中的成员函数 fun() 可以轻松访问4个变量,没毛病吧。然后定义一个B类,使用public继承,在B类的构造函数里面调用A的构造函数,为啥可以调用呢?因为A类的构造函数是pubic类型的成员函数,注意一个细节,默认的构造函数是private类型的,在这里特意声明为public!回到主题,既然是public类型,那么被B类继承下来,就变成B类的public成员函数了,当然可以调用!
然后下面的就不用多说,在B类里面的fun成员函数,可以访问a,a1,a2因为public继承会让基类的public和protected变成自己的public和protected,当然可以访问。
main函数中就不多说,public成员可以直接访问,protected和private成员相似,类外不能直接访问!
protected继承
其实明白道理就差不多,protected继承,让基类的public成员和protected成员都变成自己的protected成员
private继承
就是让基类的都变成自己的private成员!
多继承
先来明白多继承的概念:
多继承就是一个子类可以有多个父类
继承特点上面已经说过了,带入使用即可。
基本继承语法如下:
class Rectangle: public Shape, public PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
Rectangle使用public继承方式继承Shape类和PainCost类。
---------结语:我们都不知道未来如何,只能一路前进!---------