首页 > 编程语言 >C++超详细知识点(四):类的继承和派生

C++超详细知识点(四):类的继承和派生

时间:2024-03-14 13:30:12浏览次数:25  
标签:知识点 派生 私有 成员 派生类 C++ public 基类 class

目录

标题:类的继承和派生

  类的继承和派生是一种机制,允许你创建一个新的类(称为子类或派生类),该类继承另一个已存在的类(称为基类或父类)的成员(属性和方法)。这使得你可以在新类中重用已有类的代码,并在其上添加新的功能或修改现有的功能。

例如:

#include <iostream>

// 基类(父类)
class Animal 
{
   public:
     void eat() {
        std::cout << "Animal is eating." << std::endl;
     }
     void sleep() {
        std::cout << "Animal is sleeping." << std::endl;
    }
};

// 派生类(子类),继承自 Animal
class Dog : public Animal 
{
   public:
     void bark() {
        std::cout << "Dog is barking." << std::endl;
     }
};

int main() {
    // 创建派生类的对象
    Dog myDog;

    // 使用继承自基类的方法
    myDog.eat();
    myDog.sleep();

    // 新功能:调用派生类独有的方法
    myDog.bark();
    return 0;
}

继承的类型有三种:公有继承(public)、保护继承(protected)、私有继承(private)。
  在上述的例子中,我们使用的是公有继承(public Animal),这意味着基类的公共成员在子类中仍然是公共的。通常情况下,公有继承是最常见的类型,因为它维护了基类成员的可访问性。

1. 公有继承

使用 public 关键字表示,如 class Dog: public Animal。
  基类的公共成员在派生类中保持为公共成员,基类的保护成员在派生类中变为保护成员
  基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。

2. 保护继承

使用 protected 关键字表示,如 class Derived : protected Base。
  基类的公共成员和保护成员在派生类中都变为保护成员
  基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。

3. 私有继承

使用 private 关键字表示,如 class Derived : private Base。
  基类的公共成员保护成员在派生类中都变为私有成员
  基类的私有成员在派生类中不可直接访问。基类的私有成员对于派生类是不可见的。

例如:

class Base
{
	public:
	    int publicMember;
	protected:
	    int protectedMember;
	private:
	    int privateMember;
};

class Derived : public Base   //公有继承
{
    // publicMember 是公共的
    // protectedMember 变为派生类的保护成员
    // privateMember 在派生类中不可访问
};
class Derived : protected Base {  //保护继承
    // publicMember 变为派生类的保护成员
    // protectedMember 变为派生类的保护成员
    // privateMember 在派生类中不可访问
};
class Derived : private Base {  //私有继承
    // publicMember 变为派生类的私有成员
    // protectedMember 变为派生类的私有成员
    // privateMember 在派生类中不可访问
};

4. 问题:基类的私有成员在派生类中不可访问,那么怎么才能访问其父类(基类)的私有成员呢?

(1)使用公有/保护成员函数。

  在基类中提供公有或保护的成员函数,通过这些函数来访问私有成员。派生类可以调用这些函数来访问私有成员。

class Base 
{
   private:
	    int privateMember;
	
   public:
	    void setPrivateMember(int value) {
	        privateMember = value;
	    }
	
	    int getPrivateMember() const {
	        return privateMember;
	    }
};

class Derived : public Base 
{
  public:
      void accessPrivateMember() {
        setPrivateMember(42);        // 通过公有成员函数设置私有成员的值
        int value = getPrivateMember();  // 通过公有成员函数获取私有成员的值
    }
};
(2)使用友元函数或友元类。

   可以在基类中声明派生类为友元类,从而让派生类能够直接访问基类的私有成员。

class Derived;  // 前向声明,不然Base中无法识别到该类,类的声明必须在使用之前。
class Base
{
	private:
	   int privateMember;
	   // 声明 Derived 为友元类
	   friend class Derived;
};

class Derived : public Base 
{
	public:
	    void accessPrivateMember() {
	        // 可以直接访问基类的私有成员
	        Base::privateMember = 42;
    }
};

  需要注意的是,尽管上述方法可以实现访问私有成员,但在面向对象的设计中,尽量避免直接访问基类的私有成员,以维护封装性和代码的可维护性。通常情况下,应该通过公有/保护的接口(成员函数)来间接访问基类的私有成员。

标签:知识点,派生,私有,成员,派生类,C++,public,基类,class
From: https://blog.csdn.net/qq_48361010/article/details/136646950

相关文章

  • C++windows编码问题
    需要注意的编码方式有三处:操作系统、程序编码(与源文件编码一致)、通信对方传入字符的编码程序编码(与源文件编码一致)操作系统编码对方传入的编码中文是否okc2A0编码的空格utf-8utf-8utf-8okokutf-8gbkgbk正常中文可以,特殊空......
  • Lua 如何在Lua中调用C/C++函数
    Lua调用C函数有两种方式程序主体在C中运行,C函数注册到Lua中。C调用Lua,Lua调用C注册的函数,C或者Lua得到函数的执行结果。程序主体在Lua中运行,C函数作为库函数供Lua使用。C++的代码如下如何在Lua脚本中调用这个C语言函数(add_function)?#include<QCoreApplication>#inclu......
  • C++工程(五):CMake+NDK交叉编译
    写一个HelloWorld#include<iostream>intmain(intargc,charconst*argv[]){for(inti=0;i<5;++i)std::cout<<"HelloWorld"<<std::endl;return0;}build_for_android.sh脚本文件#/bin/bashexportANDROID......
  • Java知识点之单例模式
    1、单例模式(BinarySearch)单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但......
  • 【C++】继承
    目录一、继承的概念和定义1.1、继承的概念1.2、定义方式1.3、继承关系和访问限定符二、基类和派生类对象的赋值转换三、继承中的作用域四、派生类的默认成员函数问题:子类编译默认生成的构造函数会做什么?4.1、构造函数4.2、析构函数4.3、拷贝构造4.4、赋值运算符......
  • C++:[NWRRC2015] Concatenation(洛谷)P7050
    题目描述FamousprogrammerGennadylikestocreatenewwords.Onewaytodoitistoconcatenateexistingwords.Thatmeanswritingonewordafteranother.Forexample,ifhehaswords cat and dog,hewouldgetaword catdog,thatcouldmeansomething......
  • FPGA的FIFO部分的知识点
    看的小梅哥的新视频,FIFO这边讲的不太清楚,换正点原子的fifo听一下。后面的以太网和HDMI有空也看一下正点原子的,主要是想快速看zynq的知识,而且现在学的很多都是模仿抄代码,真正自己来还是得工程中实际应用的时候才会使用学习FIFO,先入先出,像队列。常用于数据的缓存,因为数据的读写带......
  • 详解c++多态中的析构与构造函数
    首先简单介绍一下多态。多态是面向对象编程中的概念,它允许我们使用基类类型的指针或引用来调用派生类对象的方法。C++中实现多态主要依靠虚函数和动态绑定。那怎么使用多态呢?基类指针或引用指向派生类对象。在我学习过程中,这些概念耳熟能详,但是为什么要有多态呢,先看下面这......
  • c++:类和对象中:拷贝构造和赋值运算符重载详解
    c++:类和对象构造函数和析构函数详解`文章目录c++:类和对象构造函数和析构函数详解前言一、拷贝构造怎么写拷贝构造1.拷贝构造也是构造函数的一种,构造函数没有值.所以拷贝构造也没有返回值**2.拷贝构造只有一个形参,正常这个形参是自定义类型对象的引用.3.如果我们......
  • L1-011 A-B(C和C++)
    题目:本题要求你计算A−B。不过麻烦的是,A和B都是字符串——即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。输入格式:输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行......