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

本文详细解释了C++中类的继承机制,包括公有、保护和私有继承的区别。重点介绍了如何在派生类中访问基类的私有成员,方法包括使用公有/保护成员函数和友元函数。强调了面向对象设计中维护封装性的原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题:类的继承和派生

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

例如:

#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;
    }
};

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

参考资源链接:[深圳充充电桩软件设计文档](https://wenku.csdn.net/doc/6zf98xrh4w?utm_source=wenku_answer2doc_content) 在《深圳充充电桩软件设计文档》中,我们可以找到关于充电桩预约系统用户界面设计的详细说明。这份文档不仅提供了设计原型图,还具体介绍了软件的架构模块设计,特别是在“详细设计”部分,文档详细解析了预约充电流程。 要设计一个充电桩预约系统的用户界面,并实现地图筛选与支付功能,我们需要遵循以下步骤: 1. **界面设计**:首先,根据功能需求划分用户界面的模块,包括主页、发现充电站、预约列表支付页面等。 2. **地图筛选充电站**:在发现充电站的页面中,集成地图服务(如Google Maps API或高德地图SDK),允许用户通过地图定位并筛选附近的充电站。 3. **预约流程**:当用户选择充电站后,设计预约流程,包括日期、时间充电时长的选择,并在用户确认后将预约信息保存到本地数据库或服务器。 4. **支付功能**:集成第三方支付SDK(如支付宝、微信支付等),确保用户在充电前能够通过这些支付方式完成费用支付。 5. **代码实现**:在Android开发环境下,使用Java或Kotlin语言,根据模块化设计原则,将每个功能模块(如地图筛选、预约流程、支付等)封装在独立的源码包中。例如,地图筛选功能可以封装在`discovery.map`源码包中,预约功能在`home.reservation`源码包中,支付功能在`mine.payment`源码包中。 6. **用户测试**:在每个模块开发完成后进行单元测试,确保各个功能能够独立正常工作。之后进行集成测试,模拟用户操作流程,确保整个预约系统界面连贯、操作流畅且无明显bug。 在实施上述步骤时,我们应参考《深圳充充电桩软件设计文档》中的详细设计说明,确保我们的设计与文档中规定的架构模块划分相匹配。这样的实践不仅可以帮助我们理解如何构建一个完整的充电桩预约系统,还能让我们在遇到具体技术问题时,找到文档中提供的解决方案。 参考资源链接:[深圳充充电桩软件设计文档](https://wenku.csdn.net/doc/6zf98xrh4w?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值