C++中继承的概念和定义

目录
  • 1.继承的概念及定义
    • 1.1继承的概念
    • 1.2继承的定义格式
    • 1.3继承基类成员访问方式的变化
      • (1)公有继承
      • (2)保护继承
      • (3)私有继承
    • 1.4总结
  • 2.基类和派生类对象赋值转换
  • 3.继承中的作用域
  • 总结

1.继承的概念及定义

1.1继承的概念

继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

1.2继承的定义格式

1.3继承基类成员访问方式的变化

(1)公有继承

基类的公有成员,子类可以继承为自己的公有成员。在派生类可以访问,在外部也可以访问。

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

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

(2)保护继承

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

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

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

(3)私有继承

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

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

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

1.4总结

(1)基类private成员任何方式继承在派生类中都是不可见的。不可见指派生类对象不能去访问它,但是基类的私有成员还是被继承到了派生类对象中。

(2)基类的public成员和protected成员任何继承方式在派生类都可以访问。

(3)基类pretected成员,派生类可以访问,类外不能访问。

(4)基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式)。public > protected > private。

(5)使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。

class Derived : public Base   //指明继承方式是public
class Derived : Base          //没写的情况下是private
struct Derived : Base         //没写的情况下是public

(6)在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,实际中
扩展维护性不强。

2.基类和派生类对象赋值转换

派生类对象可以赋值给基类的对象 / 基类的指针 / 基类的引用。

基类对象不能赋值给派生类对象

基类的指针可以通过强制类型转换赋值给派生类的指针。但是必须是基类的指针是指向派生类对象时才是安全的。

class Person //基类/父类
{
protected :
	string _name; // 姓名
	string _sex; // 性别
	int _age; // 年龄
};
class Student : public Person  //派生类/子类
{
public :
	int _No ; // 学号
};
void Test ()
{
	Student sobj ;  //创建子类对象sobj
	// 1.子类对象可以赋值给父类对象/指针/引用
	Person pobj = sobj ;
	Person* pp = &sobj;
	Person& rp = sobj;
	//2.基类对象不能赋值给派生类对象
	sobj = pobj;  //错误
	// 3.基类的指针可以通过强制类型转换赋值给派生类的指针
	pp = &sobj
	Student* ps1 = (Student*)pp; // 这种情况转换时可以的。
	ps1->_No = 10;
	pp = &pobj;
	Student* ps2 = (Student*)pp; // 这种情况转换时虽然可以,但是会存在越界访问的问题
	ps2->_No = 10;
}

3.继承中的作用域

在继承体系中基类和派生类都有独立的作用域。

子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)

需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。

注意在实际中在继承体系里面最好不要定义同名的成员。

// B中的fun和A中的fun不是构成重载,因为不是在同一作用域
// B中的fun和A中的fun构成隐藏,成员函数满足函数名相同就构成隐藏。
class A  //基类
{
public:
	void fun()
	{
		cout << "func()" << endl;
	}
};
class B : public A  //派生类
{
public:
	void fun(int i)
	{
		A::fun();
		cout << "func(int i)->" <<i<<endl;
	}
};
void Test()
{
	B b;
	b.fun(10);
};
//如果通过子类对象调用相同名称的成员时,优先访问子类的,基类同名的成员永远无法通过
// 子类对象直接调用到,相当于子类同名成员将基类的同名成员隐藏了
// 如果想要同名子类对象访问基类中同名的成员,只需在成员前加上基类名称::
// 如果在子类成员函数中,想要访问基类同名的成员,只需在基类成员前加上基类名称::
class Base  //基类
{
public:
	void SetBase(int b)
	{
		_b = b;
	}
	void fun()
	{
		cout << "Base::fun()" << endl;
	}
public:
	int _b;
	char _c;
};
class Derived : public Base  //派生类
{
public:
	void SetDeirved(int b, int d)
	{
		_c = 100;
		Base::_c = 100;  //如果在子类成员函数中,想要访问基类同名的成员,只需在基类成员前加上基类名称::
		__super::_c = 100;
		SetBase(b);
		_d = d;
	}
	void fun(int a)
	{
		cout << "Derived::fun(int)" << endl;
	}
public:
	int _d;
	int _c;
};

int main()
{
	Base b;
	b.SetBase(10);
	Derived d;
	d.SetDeirved(100, 200);
	/*
	如果子类和基类中具有相同名称的成员变量时,不管成员变量的类型是否相同,
	都优先访问子类的同名成员变量
	不能通过子类对象直接访问子类和父类中同名的成员变量,就相当与子类同名的成员变量将基类的同名成员变量隐藏了
	*/
	d._c = 'A';   // d对象中有两个_c
	// 有些情况下可能需要通过子类对象访问基类中同名的成员变量
	d.Base::_c = 'B';

	// d.fun();   // 编译报错
	d.fun(10);
	d.Base::fun(); //如果想要同名子类对象访问基类中同名的成员,只需在成员前加上基类名称::
	return 0;
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 一文读懂C++中的继承之菱形继承(案例分析)

    前言 我们上一篇说了世间万物都有一个继承体制,或多或少子类继承了父类的某些特征,但大多都是单向继承,但是就有些特例他就是多继承,比如: 我们从图片中就可以看到,两栖动物它既继承了水生动物的一部分特性,也继承了陆地动物的一些特性,那么我们的代码,会不会也会有这种多继承现象呢,我们一起来看一下. 提示:以下是本篇文章正文内容,下面案例可供参考 一.什么是多继承? 1.单继承 我们来看一个图先了解一下单继承,再看有什莫区别 也就是说,一个子类只有一个直接父类时称这个继承关系为单继承 2.多继承 我们把

  • c++中的继承关系

    1 什么是继承 继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 面向对象的继承关系指类之间的父子关系.用类图表示如下: 2 为什么要有继承?/ 继承的意义? 因为继承是面向对象中代码复用的一种手段.通过继承,可以获取父类的所有功能,也可以在子类中重写父类已有的功能 以及 添加父类中没有的功能. 3如何理

  • 关于C++虚继承的内存模型问题

    1.前言 C++虚继承的内存模型是一个经典的问题,其具体实现依赖于编译器,可能会出现较大差异,但原理和最终的目的是大体相同的.本文将对g++中虚继承的内存模型进行详细解析. 2.多继承存在的问题 C++的多继承是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员.从概念上来讲这是非常简单的,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个,比如典型的是菱形继承,如图2-1所示: 图2-1 菱形继承 在图2-1中,类A派生出类B和类C,类D继承自类

  • 老生常谈C++ 中的继承

    继承 1 什么是继承 1.1 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段,这个机制允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程.以前解除的都是函数复用,继承是类设计层次的复用. 代码演示如下 #include <iostream> #include <string> using namespace std; class Person { public: v

  • C++继承的定义与注意事项

    一.什么是继承? 1.1.概念 **继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类. 1.2.定义 下面我们看到Person是父类,也称作基类.Student是子类,也称作派生类 1.2.1.继承关系和访问限定符 1.2.2.继承基类成员访问方式的变化 // 实例演示三种继承关系下基类成员的各类型成员访问关系的变化 class Person { public : void Prin

  • C++中继承的概念和定义

    目录 1.继承的概念及定义 1.1继承的概念 1.2继承的定义格式 1.3继承基类成员访问方式的变化 (1)公有继承 (2)保护继承 (3)私有继承 1.4总结 2.基类和派生类对象赋值转换 3.继承中的作用域 总结 1.继承的概念及定义 1.1继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程.以前我们接触的复用都是函数复用,继承

  • 一文搞懂C++中继承的概念与使用

    目录 前言 继承概念及定义 继承概念 继承定义 继承方式 父类和子类对象赋值转换 继承中的作用域 派生类的默认成员函数 派生类的友元与静态成员 继承关系 单继承 多继承 菱形继承 前言 我们都知道面向对象语言的三大特点是:**封装,继承,多态.**之前在类和对象部分,我们提到了C++中的封装,那么今天呢,我们来学习一下C++中的继承. 继承概念及定义 继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能

  • C++ 超详细梳理继承的概念与使用

    目录 继承的概念及定义 继承的概念 继承定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 菱形继承 虚拟继承解决数据冗余和二义性的原理 继承的总结和反思 继承的概念及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体

  • 浅谈java中OO的概念和设计原则(必看)

    一.OO(面向对象)的设计基础 面向对象(OO):就是基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供灵活性,来认识.理解.刻划客观世界和设计.构建相应的软件系统.面向对象的特征:虽然各种面向对象编程语言相互有别,但都能看到它们对面向对象基本特征的支持, 即 "抽象.封装.继承.多态" : – 抽象,先不考虑细节 – 封装,隐藏内部实现 – 继承,复用现有代码 – 多态,改写对象行为 面向对象设计模式:是"好的面向对象设计",所谓"

  • C++中继承与多态的基础虚函数类详解

    前言 本文主要给大家介绍了关于C++中继承与多态的基础虚函数类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 虚函数类 继承中我们经常提到虚拟继承,现在我们来探究这种的虚函数,虚函数类的成员函数前面加virtual关键字,则这个成员函数称为虚函数,不要小看这个虚函数,他可以解决继承中许多棘手的问题,而对于多态那他更重要了,没有它就没有多态,所以这个知识点非常重要,以及后面介绍的虚函数表都极其重要,一定要认真的理解~ 现在开始概念虚函数就又引出一个概念,那就是重写(覆

  • Java中继承、多态、重载和重写介绍

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

  • java继承的概念及案例解析

    这篇文章主要介绍了java继承的概念及案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package java09; //定义一个员工类 public class Employee { public void method(){ System.out.println("方法执行!!!"); } } package java09; //定义一个教师类 public class Teacher extends Employee {

  • C++中继承(inheritance)详解及其作用介绍

    概述 面向对象程序设计中最重要的一个概念是继承 (inheritance). 继承允许我们依据另一个类来定义一个类, 这使得创建和维护一个应用程序变得更统一. 这样做也达到了重用代码功能和提高执行效率的效果. 类的概念 一个类中包含了若干数据成员和成员函数. 不同的类中的数据成员和成员函数各不相同. 但是有时两个类的内容基本相同. 例如: 继承的概念 继承 (inheritance) 就是在一个已存在的类的基础上建立一个新的类. 已存在的类: 基类 (base class) 或父类 (fathe

  • 计算机程序设计并行计算概念及定义全面详解

    目录 1 摘要 2 概述 2.1 什么是并行计算? 2.2 为什么要并行计算? 2.3 谁都在使用并行计算? 科学界和工程界: 工业界和商业界: 全球应用: 3 概念和术语 3.1 冯诺依曼体系结构 3.2 弗林的经典分类 3.3 一些常见的并行计算术语 3.4 并行程序的缺陷和代价 复杂性: 可移植性: 资源需求: 可扩展性: 4 并行计算机的内存架构 4.1 共享内存 统一内存存取(Uniform Memory Access): 非统一内存存取(Non-Uniform Memory Acce

  • C++数据结构继承的概念与菱形继承及虚拟继承和组合

    目录 继承的概念 继承的定义 基类和派生类对象之间的赋值转换 继承中的作用域 派生类的默认成员函数 继承中的两个小细节

随机推荐