C++ 类的继承与派生实例详解

 C++ 类的继承与派生实例详解

继承性是面向对象程序设计最重要的特性之一,使软件有了可重用性,C++提供的类的继承机制。

继承与派生的概念

一个新类从已有的类那里获得已有的特性,这种现象称为类的继承。同样也可以说成已有的类派生出来了新的类。类A继承自类B也就是类B派生了类A。所以继承和派生的关系就像小学时把字句和被字句的造句一样。有了继承与派生后,就有了父类/基类与子类/派生类,C++中将类B称为父类/基类,将类A称为子类/派生类。

派生类的声明:

#include <iostream>

using namespace std;

class Student  //基类的声明
{
public:
  Student()
  {
    num = 1;
    name = 'Z';
    sex = 'm';
  }
  void myshow()
  {
    cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
  }
private:
  int num;
  char name;
  char sex;
};
class Student1:public Student //派生类的声明
{
public:
  Student1()
  {
   age = 16;
  }
  void myshow1()
  {
   myshow();
   cout<<"age:"<<age<<endl;
  }
private:
  int age;
};
int main()
{
  Student stu;
  stu.myshow();
  Student1 stu1;
  stu1.myshow1();
  getchar();
  return 0;
}

运行结果:

num:1
name:Z
sex:m
age:16
num:1
name:Z
sex:m

从上述代码中,可以看出类的继承的形式与特性:

1.类的继承以class Student1:public Student{} 的形式,Student是基类,Student1是派生类,继承方式为public(公用继承)。

2.派生类需要把基类的全部成员(不包括构造函数与析构函数)接收过来,不能只接受一部分。

3.类的继承方式包括:public(公用继承),private(私有继承),protected(受保护的),而不同的继承方式将影响派生类成员的访问属性。

公用继承

如果采用公用继承,基类中的访问属性在派生类中保持不变,即:

基类中的私有属性——派生类中私有属性

基类中的共用属性——派生类中共用属性

基类中的受保护属性——派生类中受保护属性

class Student  //基类的声明
{
public:
  Student()
  {
    num = 1;
    name = 'Z';
    sex = 'm';
  }
  void myshow()
  {
    cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
  }
private:
  int num;
  char name;
  char sex;
};
class Student1:public Student //派生类的声明
{
public:
  Student1()
  {
   age = 16;
  }
  void myshow1()
  {
   myshow();
   cout<<"age:"<<age<<endl;
  }
private:
  int age;
};

在这个例子中,派生类Student1中的私有成员为:

  int num;
  char name;
  char sex;
  int age;

共有成员为:

 myshow();
  myshow1();

私有继承

如果采用私有继承,基类中的访问属性在派生类中发生如下变化,即:

基类中的私有属性——派生类中不可访问

基类中的共用属性——派生类中私有属性

基类中的受保护属性——派生类中私有属性

class Student  //基类的声明
{
public:
  Student()
  {
    num = 1;
    name = 'Z';
    sex = 'm';
  }
  void myshow()
  {
    cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
  }
private:
  int num;
  char name;
  char sex;
};
class Student1:private Student //派生类的声明
{
public:
  Student1()
  {
   age = 16;
  }
  void myshow1()
  {
   myshow();
   cout<<"age:"<<age<<endl;
  }
private:
  int age;
};

在这个例子中,派生类Student1中的私有成员为:

 int age;//子类新增
  myshow();//继承自父类

共有成员为:

  myshow1(); //子类新增

子类不可访问:

  int num;
  char name;
  char sex;

保护继承

受保护的成员不能被类外访问,这一点类似私有成员,可以认为保护尘缘对类的用户来说是私有的。但是有一点与私有成员不同:受保护成员可以被派生类的成员函数引用。

如果采用保护继承,基类中的访问属性在派生类中发生如下变化,即:

基类中的私有属性——派生类中不可访问

基类中的共用属性——派生类中受保护属性

基类中的受保护属性——派生类中受保护属性

class Student
{
public:
  Student()
  {
    num = 1;
    name = 'Z';
    sex = 'm';
  }
 protected:
  void myshow()
  {
    cout<<"num:"<<num<<endl<<"name:"<<name<<endl<<"sex:"<<sex<<endl;
  }
private:
  int num;
  char name;
  char sex;
};
class Student1:protected Student
{
public:
  Student1()
  {
    age = 16;
  }
  void myshow1()
  {
    cout<<"age:"<<age<<endl;
  }
private:
  int age;
};

如以上例子所示(当然这个例子没有什么意义,一个类数据私有,函数受保护就没有与外界的接口了,在这里仅仅作为例子)

在这个例子中,派生类Student1中的私有成员为:

  int age;

共有成员为:

myshow1(); 

受保护成员为:

  myshow(); 

子类不可访问:

  int num;
  char name;
  char sex;

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++中的聚合类定义与用法分析

    本文实例讲述了C++中的聚合类.分享给大家供大家参考,具体如下: 聚合类是一种没有用户定义的构造函数,没有私有(private)和保护(protected)非静态数据成员,没有基类,没有虚函数.这样的类可以由封闭的大括号用逗号分隔开初始化列表.下列的代码在 C 和 C++ 具有相同的语法: struct C { int a; double b; }; struct D { int a; double b; C c; }; // initialize an object of type C wit

  • 详解C++的String类的字符串分割实现

    详解C++的String类的字符串分割实现 功能需求,输入一个字符串"1-2-3"切割出"1"."2"."3".在Java下直接用String的split函数就可以了.c++下String没有直接提供这个函数,需要自己写. 网上给出的解决方案是这里的三种方法.但我是通过JNI访问的,在里面用这些vector可能不中,自己封装了个,仅供参考: String recogScop = "01-02-03"; co

  • C++自定义封装socket操作业务类完整实例

    本文实例讲述了C++自定义封装socket操作业务类.分享给大家供大家参考,具体如下: Linux下C++封装socket操作的工具类(自己实现) socketconnector.h #ifndef SOCKETCONNECTOR_H #define SOCKETCONNECTOR_H #include "global.h" using namespace std; class SocketConnector { public: typedef enum { ENormal, EOth

  • C++类继承之子类调用父类的构造函数的实例详解

    C++类继承之子类调用父类的构造函数的实例详解 父类HttpUtil: #pragma once #include <windows.h> #include <string> using namespace std; class HttpUtil { private: LPVOID hInternet; LPVOID hConnect; LPVOID hRequest; protected: wchar_t * mHostName; short mPort; string send

  • C++ 中类的拷贝、赋值、销毁的实例详解

    C++ 中类的拷贝.赋值.销毁的实例详解 本篇文章我们一共讲解一下几个知识点: 类的拷贝构造函数. 类的拷贝赋值运算符. 类的析构. 好了one by one 如果我们没有定义类的拷贝构造函数的话,那么编译器会为我们合成默认拷贝构造函数----合成拷贝构造函数. 和成拷贝构造函数的操作是将其参数的各个成员拷贝到正在创建的对象中去,每个成员的类型决定了他是如何被拷贝的:对类类型的成员,会使用其拷贝构造函数,内置类型的成员则是直接拷贝,虽然我们不能直接拷贝一个数组,但是合成拷贝构造函数会逐个的拷贝一

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

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

  • C++ 类的继承与派生实例详解

     C++ 类的继承与派生实例详解 继承性是面向对象程序设计最重要的特性之一,使软件有了可重用性,C++提供的类的继承机制. 继承与派生的概念 一个新类从已有的类那里获得已有的特性,这种现象称为类的继承.同样也可以说成已有的类派生出来了新的类.类A继承自类B也就是类B派生了类A.所以继承和派生的关系就像小学时把字句和被字句的造句一样.有了继承与派生后,就有了父类/基类与子类/派生类,C++中将类B称为父类/基类,将类A称为子类/派生类. 派生类的声明: #include <iostream> u

  • Python类的继承和多态代码详解

    Python类的继承 在OOP(ObjectOrientedProgramming)程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Baseclass.Superclass). 我们先来定义一个classPerson,表示人,定义属性变量name及sex(姓名和性别): 定义一个方法print_title():当sex是male时,printman:当sex是female时,prin

  • Python中类的定义、继承及使用对象实例详解

    本文实例讲述了Python中类的定义.继承及使用对象的方法.分享给大家供大家参考.具体分析如下: Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的一些特性,如人类有名字.身高和体重等属性,而具体值则会根据每个人的不同:功能则是类所能实现的行为,如人类拥有吃饭.走路和睡觉等功能.具体的形式如下: 例:类的概念: class 人类:             

  • C++多继承多态的实例详解

    C++多继承多态的实现 如果一个类中存在虚函数,在声明类的对象时,编译器就会给该对象生成一个虚函数指针,该虚函数指针指向该类对应的虚函数表. 多态的实现是因为使用了一种动态绑定的机制,在编译期间不确定调用函数的地址,在调用虚函数的时候,去查询虚函数指针所指向的虚函数表. 派生类生成的对象中的虚函数指针指向的是派生类的虚函数表,因此无论是基类还是派生来调用,都是查询的是派生类的表,调用的是派生类的函数. 如果发生了多继承,多个基类中都有虚函数,那么该是怎样的呢?虚函数指针如何排列,多个基类的指针为

  • Java数据库操作库DButils类的使用方法与实例详解

    DbUtils是Javar的一个为简化JDBC操作类库 commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernate的公司的首选. 整个dbutils总共才3个包: org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC) org.apache.commons.db

  • 使用IntelliJ IDEA查看类的继承关系图形(图文详解)

    最近正好也没什么可忙的,就回过头来鼓捣过去的知识点,到Servlet部分时,以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟. 这次利用了IDEA的diagram,结果一目了然,也是好用到炸裂,就此分享. 1.查看图形形式的继承链 在你想查看的类的标签页内,点击 右键,选择 Diagrams ,其中有 show 和 show ... Popup,只是前者新建在标签页内,后者以浮窗的形式展示: 实际上,你也可以从左边的项目目录树中,对你想查看的类点击右键,同样选择Diagrams,效果

  • django中模板继承与ModelForm实例详解

    目录 模板的继承 form和ModelForm 使用方法 总结 模板的继承 完美在写html的时候会发现,自己多个html文件中又好多东西是一样的,包括静插件的引入 还有有些简单的css样式都不需要修改,这样完美就可以引入有关模板来方便操作 {% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title

  • python中class类与方法的用法实例详解

    目录 类和方法的概念和实例 1.python类:class 2.类的构造方法__init__() 3.类中方法的参数self 4.继承 5.方法重写 类的特殊属性与方法 类的私有属性 总结 因为一直不太清楚面向对象的类和方法的编程思想,所以特地补了一下python-class的知识,在这里记录和分享一下. 类和方法的概念和实例 类(Class):用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 方法:类中定义的函数. 类的构造方法__init

  • JavaScript继承与聚合实例详解

    本文实例讲述了JavaScript继承与聚合.分享给大家供大家参考,具体如下: 一.继承 第一种方式:类与被继承类直接耦合度高 1. 首先,准备一个可以被继承的类(父类),例如 //创建一个人员类 function Person(name) {//现在Person里面的域是由Person里面的 来this来控制的 this.name=name; } 2. 然后,有个需要继承父类的子类 function Teacher(name,books) { Person.call(this,name);//

  • asp.net类序列化生成xml文件实例详解

    本文实例讲述了asp.net类序列化生成xml文件的方法.分享给大家供大家参考,具体如下: 根据设计的需求需要开发多个商品的API 原XML文件如下: <urlset> <url> <loc>http://www.xxxxx.com/todaydetials.aspx?id=143</loc> <data> <display> <website>爱购114</website> <siteurl>ht

随机推荐