三种继承方式

三种继承方式:公有继承私有继承,保护继承

不同继承方式的影响主要体现在:

  • 派生类成员对基类成员的访问权限
  • 派生类对象对基类成员的访问权限

公有继承:

  • 基类的publicprotected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象只能访问基类的public成员。
//头文件部分
//Point.h
#ifndef_POINT_H
#define _POINT_H
class Point {                                  //基类Point类的定义
public:                                      //公有函数成员
	void initPoint(int x = 0, int y = 0)
	{
		this->x = x; this->y = y;
	}
	void move(int offX, int offY)
	{
		x += offX; y += offY;
	}
	int getX() const { return x; }
	int getY() const { return y; }
private:                                    //私有数据成员
	int x, y;
};
#endif                                      //_POINT_H


//Rectangle.h
#ifndef_RECTANGLE_H
#define _RECTANGLE_H
#include "Point.h"
class Rectangle : public Point {              //派生类定义部分
public:                                     //新增公有函数成员
	void initRectangle(int x, int y, int w, int h)
	{
		initPoint(x, y);              //调用基类公有成员函数
		this->w = w;
		this->h = h;
	}
	int getH() const { return h; }
	int getW() const { return w; }
private:                                    //新增私有数据成员
	int w, h;
};
#endif                                      //_RECTANGLE_H

//程序主函数
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	Rectangle rect;                       //定义Rectangle类的对象
	rect.initRectangle(2, 3, 20, 10);    //设置矩形的数据
	rect.move(3, 2);                      //移动矩形位置
	cout << "The data of rect(x,y,w,h): " << endl;
                                             //输出矩形的特征参数
	cout << rect.getX() << ", "
		<< rect.getY() << ", "
		<< rect.getW() << ", "
		<< rect.getH() << endl;
	return 0;
}

程序运行结果

The data of rect(x, y, w, h) :
5,5,20,20

私有继承(private)

  • 基类的publicprotected成员都以private身份出现在派生类中,但基类的private成员不可直接访问
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象不能直接访问基类中的任何成员。
//Point.h
#ifndef_POINT_H
#define _POINT_H
class Point
{                                                    //基类Point类的定义
public:                                              //公有函数成员
	void initPoint(int x = 0, int y = 0)
	{
		this->x = x; this->y = y;
	}
	void move(float offX, float offY)
	{
		x += offX; y += offY;
	}
	int getX() const { return x; }
	int getY() const { return y; }
private:                                            //私有数据成员
	int x, y;
};
#endif                                              //_POINT_H


//Rectangle.h
#ifndef_RECTANGLE_H
#define _RECTANGLE_H
#include "Point.h"
class Rectangle : private Point
{                                                    //派生类定义部分
public:                                              //新增公有函数成员
	void initRectangle(int x, int y, int w, int h)
	{
		initPoint(x, y);                     //调用基类公有成员函数
		this->w = w;
		this->h = h;
	}
	void move(int offX, int offY)
	{
		Point::move(offX, offY);
	}
	int getX() const { return Point::getX(); }
	int getY() const { return Point::getY(); }
	int getH() const { return h; }
	int getW() const { return w; }
private:                                            //新增私有数据成员
	int w, h;
};
#endif                                              //_RECTANGLE_H

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	Rectangle rect;                             //定义Rectangle类的对象
	rect.initRectangle(2, 3, 20, 10);               //设置矩形的数据
	rect.move(3, 2);                            //移动矩形位置
	cout << "The data of rect(x,y,w,h): " << endl;
	cout << rect.getX() << ", "              //输出矩形的特征参数
		<< rect.getY() << ", "
		<< rect.getW() << ", "
		<< rect.getH() << endl;
	return 0;
}

保护继承(protected)

  • 基类的publicprotected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象不能直接访问基类中的任何成员


protected 成员的特点与作用:

  • 对建立其所在类对象的模块来说,它与private成员的性质相同
  • 对于其派生类来说,它与public成员的性质相同
  • 既实现了数据隐藏,又方便继承,实现代码重用。
class A {
protected:
	int x;
};
int main() {
	A a;
	a.x = 5;         //错误
}
class A {
protected:
	int x;
};
class B : public A{
public:
	void function();
};
void B : function() {
	x = 5;         //正确
}


  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 三种继承方式分别为公有继承、私有继承和保护继承。公有继承意味着派生类可以访问基类的公有成员,私有继承意味着派生类不能访问基类的公有成员,只能访问基类的私有成员,而保护继承则允许派生类访问基类的保护成员。这三种继承方式的主要区别在于对于基类成员的访问权限的不同控制。 ### 回答2: 继承是面向对象编程中的重要概念,是实现代码重用和多态性的关键。常见的继承方式包括单继承、多继承和接口继承,它们之间存在一些差别。 首先,单继承是最简单和常见的继承方式。一个类只能继承自一个父类,因此它只能继承一个父类的属性和方法。单继承能够简化代码结构,提高代码的可读性和维护性,但在某些情况下,可能无法满足多样化的需求。 其次,多继承允许一个类同时继承自多个父类。这种方式可以继承多个父类的属性和方法,从而实现多个不同类的代码复用。多继承可以提供更大的灵活性和功能扩展性,但同时也增加了代码的复杂性,容易引起命名冲突和继承链混乱的问题。 最后,接口继承是一种较为特殊的继承方式。接口是一种只包含方法声明但没有具体实现的抽象类,类可以通过实现接口来获得接口中声明的方法。接口继承强调对行为和功能的规范,一个类可以同时实现多个接口。接口继承可以增强代码的可复用性和模块化,但接口本身不能包含属性。 综上所述,三种继承方式在代码复用、功能扩展、灵活性和代码复杂度等方面存在差别。在实际开发中,应根据具体需求和设计目标选择合适的继承方式。 ### 回答3: 继承是面向对象编程中的重要概念,通过继承可以创建新的类,并重用已有类的属性和方法。在继承中,有三种比较常见的继承方式,它们分别是单继承、多继承和接口继承。 首先,单继承指的是一个子类只能继承一个父类。这意味着子类只能从一个父类中继承属性和方法。单继承使得类之间的关系简单明了,避免了多继承可能带来的类之间关系复杂性,但也限制了子类的功能扩展。 其次,多继承是指一个子类可以同时继承多个父类。通过多继承,子类可以继承多个父类的属性和方法,从而拥有更多的功能。多继承允许在一个子类中融合多个父类的特性,但容易造成代码的混乱和复杂性增加,同时也可能导致冲突和命名空间的问题。 最后,接口继承是指一个子类可以通过实现多个接口来继承多个父类。接口继承主要用于规范类的行为,而不是从父类继承具体的实现。通过接口继承,子类需要实现指定的接口,从而拥有特定的行为和能力。接口继承使得类之间的关系更加松散,提供了更大的灵活性和扩展性。 总结来说,三种继承方式各有优势和特点。单继承简单明了,多继承功能丰富但可能复杂混乱,接口继承提供了更大的灵活性和规范性。在实际编程中,应根据具体需求选择适合的继承方式,以实现代码的可维护性和扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值