C++进阶学习(4)继承

继承

一、类之间的关系

1. has-A (包含关系)

has-A 包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。

2.uses-A(使用关系)

uses-A 一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友元或对象参数传递实现。

3.is-A(继承关系)

3.is-A 机制称为“继承”。关系具有传递性,不具有对称性。

传递性 高等植物、蕨类植物、芒萁都是植物,具有植物的共同特征

不具有对称性 不是所有植物都属于蕨类

继承 是类之间定义的一种重要关系
一个 B 类继承A类,或称从类 A 派生类 B
类 A 称为基类(父类),类 B 称为派生类(子类)

二、基类和派生类

类继承关系的语法形式

	class 派生类名 : 基类名表
 	{
	      数据成员和成员函数声明
 	};

基类名表 构成
访问控制 基类名1, 访问控制 基类名2 ,… , 访问控制 基类名n

访问控制 表示派生类对基类的继承方式,使用关键字:
public 公有继承
private 私有继承
protected 保护继承

1.访问控制

派生类对基类成员的使用,与继承访问控制和基类中成员性质有关

  1. 公有继承 基类的公有成员->派生类的公有成员
    基类的保护成员->派生类的保护成员
  2. 私有继承 基类的公有成员和保护成员->派生类的私有成员
  3. 保护继承 基类的公有成员和保护成员->派生类的保护成员
  4. 不论种方式继承基类,派生类都不能直接使用基类的私有成员

2.公有继承

#include<iostream>
using namespace std ;
class A
{ public :
      void  get_XY()   { cout << "Enter two numbers of x, y : " ;  cin >> x >> y ; }
      void  put_XY()    { cout << "x = "<< x << ", y = " << y << '\n' ; }
   protected:    int x, y ;
};
class B : public A
 //语法
{ public :
      int  get_S() { return s ; };
      void  make_S()  { s = x * y ; };    	// 使用基类数据成员x,y
   protected:   int s;
};
class C : public B
{ public : 
      void  get_H()   { cout << "Enter a number of h : " ;  cin >> h ; } 
      int  get_V() { return v ; }
      void  make_V()  { make_S(); v = get_S() * h ; } 	// 使用基类成员函数
   protected:    int h, v;
};
int main()
{ A objA ;
   B objB ;
   C objC ;
   cout << "It is object_A :\n" ;
   objA.get_XY() ;
   objA.put_XY() ;
   cout << "It is object_B :\n" ;
   objB.get_XY() ;
   objB.make_S() ;
   cout << "S = " << objB.get_S() << endl ;
   cout << "It is object_C :\n" ;
   objC.get_XY() ;
   objC.get_H();
   objC.make_V() ;
   cout << "V = " << objC.get_V() << endl ;
}


3.私有继承

#include<iostream>
using namespace std ;
class A
{ public :
      void  get_XY()  { cout << "Enter two numbers of x and y : " ;  cin >> x >> y ; }
      void  put_XY()    { cout << "x = "<< x << ", y = " << y << '\n' ; }
  protected:    int x, y ;
};
class B : private A
{ public :
      int  get_S() { return s ; }
      void  make_S()  { get_XY();    s = x * y ;  }	//访问私有数据成员

   private:    int s ;
};
int main()
{ B objB ;	
   cout << "It is object_B :\n" ;
   objB.make_S() ;
   cout << "S = " << objB.get_S() << endl ;
 }

私有数据成员的测试

#include<iostream>
using namespace std ;
class A
{ public: 	 A(){ x=1; }
	 int out() {return x ; }
	 void addX() { x++; }
 //基类的私有数据成员
//不能在派生类中直接访问
//但派生类对象建立私有数据空间

   private: int x ;
} ;
class B : public A
{ public:	B(){ y=1; }
	int out() {return y ; }
	void addY() { y++; }
  private:	int y ;
} ;
int main()
{ A a ;
   cout << "a.x=" << a.out() << endl ;
   B b ;
 //创建派生类对象
//调用基类->派生类构造函数
//b.x = 1    b.y = 1

   b.addX() ;    b.addY() ;
   cout << "b.x=" << b.A::out() << endl ;
   cout << "b.y=" << b.out() << endl ;
}

4.保护继承

#include <iostream>

class Base {
public:
    void publicMethod() {
        std::cout << "Public method from Base class" << std::endl;
    }
protected:
    void protectedMethod() {
        std::cout << "Protected method from Base class" << std::endl;
    }
};

class Derived : protected Base {
public:
    void accessBaseMethods() {
        publicMethod(); // 可以访问基类的公有成员
        protectedMethod(); // 可以访问基类的保护成员
    }
};

int main() {
    Derived derivedObj;
    derivedObj.accessBaseMethods();

    return 0;
}

三、

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只特立独行猪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值