C++继承浅谈

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 类型的继承。
问题又来了,那是不是有 protectedprivate 类型的继承呢?
答案是肯定的。
下面来分析分析三种继承方式的区别:
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继承的内容是啥:基类的publicprotected成员在派生类中变成派生类的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类。

---------结语:我们都不知道未来如何,只能一路前进!---------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kcoren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值