C++继承:掌握面向对象编程的核心技巧

C++入门指南:从环境搭建到核心语法与面向对象编程 编程语言作为计算机与开发者沟通的桥梁,其核心在于将人类可读的代码转换为机器指令。编译器在这一过程中扮演着关键角色,负责语法检查、优化和生成可执行文件。掌握一门强大的编程语言,意味着能够更高效地控制系统资源、提升软件性能,并应用于操作系统、游戏引擎等高性能场景。C++以其卓越的性能和底层控制能力,成为许多核心系统开发的首选。本文以C++入门为核心,通过环境搭建、核心语法解析和面向对象编程等模块,系统讲解变量与数据类型、函数封装等基础概念,并深入探讨内存管理、RAII原则及标准库STL的使用,帮助初学者建立扎实 阅读详情

前言:

继承让我们可以在已有类的基础上,快速构建出功能更加丰富的类,实现代码复用,同时表达“是一种”这样的层次关系。可以说,不会用继承,就无法真正驾驭 C++ 面向对象编程。

1. 为什么需要继承?


假设正在开发一个学校管理系统,需要表示“学生”和“教师”。两个类都有姓名、年龄、ID 等属性,都有“显示信息”的行为。如果各自写一遍,代码高度重复,而且以后要统一添加“联系方式”字段时,就必须修改多个类。

继承的思路是:抽象出共性,放在一个基类中;特有部分,交给派生类自己处理。例如“人”就是基类,学生和教师都是“人”的派生类。这样,基类中的代码只需要写一次。

2. 基本语法

// 基类
class Person {
public:
    std::string name;
    int age;
    
    void showInfo() {
        std::cout << "姓名:" << name << ",年龄:" << age;
    }
};

// 派生类,继承自 Person
class Student : public Person {   // public 继承
public:
    std::string studentID;        // 派生类特有的成员
    void study() {
        std::cout << name << " 在学习。\n";
    }
};


这里 class Student : public Person 的意思是:Student 以 public 方式 继承 Person。继承方式决定了基类成员在派生类中的访问权限。

继承方式如下:

基类成员权限  public 继承 protected 继承 private 继承
public     仍为 public变为 protected  变为 private
protected 仍为 protected变为 protected变为 private
private不可直接访问不可直接访问不可直接访问

实战中 99% 的情况都使用 public 继承,表达“Student 是一种 Person”。

3. 访问权限回顾与 protected

private:只有本类的成员函数和友元可以访问。

protected:本类、派生类的成员函数和友元可以访问,但类的使用者不能访问。

public:所有人都能访问。

正因为基类的 private 成员在派生类中“不可直接访问”,所以我们通常会把派生类可能需要用到的内部成员设为 protected,而不是直接设为 public(破坏封装)。

class Person {
protected:
    std::string id;   // 派生类可以访问,外部不能直接访问
public:
    Person(const std::string& id) : id(id) {}
};

class Student : public Person {
public:
    Student(const std::string& id, const std::string& sid)
        : Person(id), studentID(sid) {}
    void showID() {
        std::cout << "身份证:" << id << ",学号:" << studentID << "\n";
    }
private:
    std::string studentID;
};


注意:派生类的构造函数必须在初始化列表中显式调用基类的构造函数,否则会使用基类的默认构造函数。

4. 构造与析构顺序

当创建派生类对象时,构造函数的调用顺序是:

1.基类构造函数(先构造基类部分)

2.派生类自己的成员对象(按声明顺序)

3.派生类构造函数体

析构时顺序完全相反:先析构派生类,再析构基类部分。这是递归的,如果有多层继承,就沿着继承链逐层向上构造、向下析构。

class A {
public:
    A() { std::cout << "A 构造\n"; }
    ~A() { std::cout << "A 析构\n"; }
};
class B : public A {
public:
    B() { std::cout << "B 构造\n"; }
    ~B() { std::cout << "B 析构\n"; }
};

int main() {
    B obj;
    return 0;
}
// 输出:A 构造  B 构造  B 析构  A 析构


5. 名字隐藏与重定义


如果派生类定义了一个和基类同名的函数(或同名变量),会隐藏基类中所有同名函数(包括同名的重载版本)。

class Base {
public:
    void func() { std::cout << "Base::func()\n"; }
    void func(int x) { std::cout << "Base::func(int)\n"; }
};

class Derived : public Base {
public:
    void func() { std::cout << "Derived::func()\n"; } // 隐藏了基类的所有 func
};

Derived d;
d.func();     // OK,调用派生类版本
// d.func(10); // 编译错误!Base::func(int) 被隐藏了


如果想在派生类中同时保留基类的重载版本,需要用 using Base::func; 引入名字。

class Derived : public Base {
public:
    using Base::func; // 把基类的 func 重载纳入作用域
    void func() { std::cout << "Derived::func()\n"; }
};


这个点很容易踩坑。

6. 多态与虚函数

6.1 静态绑定与动态绑定

看一个场景:

class Animal {
public:
    void speak() { std::cout << "动物叫\n"; }
};
class Dog : public Animal {
public:
    void speak() { std::cout << "汪汪\n"; }
};

int main() {
    Animal* a = new Dog();
    a->speak();   // 输出??
    delete a;
}


输出结果是“动物叫”,而不是我们期望的“汪汪”。因为编译器在编译时根据指针的静态类型(Animal*)确定了调用哪个函数,这就是静态绑定,没有实现多态。

要使它能根据对象的实际类型调用正确的函数,必须使用虚函数:

class Animal {
public:
    virtual void speak() { std::cout << "动物叫\n"; }
};
class Dog : public Animal {
public:
    void speak() override { std::cout << "汪汪\n"; }
};


这样再执行 a->speak(),就会输出“汪汪”。virtual 关键字告诉编译器:这个函数是动态绑定的,运行时根据对象的真实类型决定调用哪个版本。

6.2 override 和 final

override:显式声明这个函数意图重写基类的虚函数。如果函数签名不匹配,编译器会报错(非常推荐加上,避免粗心失误)。

final:可以修饰虚函数或类,表示禁止被进一步重写,或禁止被继承。

class Cat : public Animal {
public:
    void speak() override final { std::cout << "喵喵\n"; }
    // 该类不能再被重写 speak
};

class Kitten : public Cat {
public:
    // void speak() override; // 编译错误!Cat::speak 标记为 final
};


7. 纯虚函数与抽象类


如果一个基类中的虚函数无法给出有意义的实现,我们可以把它声明为纯虚函数,类就变成抽象类。抽象类不能直接创建对象,只能作为基类派生出具体类。

class Shape {
public:
    virtual double area() const = 0;  // 纯虚函数
    virtual ~Shape() {}               // 虚析构函数(重要!)
};

class Circle : public Shape {
    double radius;
public:
    Circle(double r) : radius(r) {}
    double area() const override {
        return 3.14159 * radius * radius;
    }
};


为什么要将基类的析构函数设为虚函数?
当通过基类指针删除派生类对象时,如果析构函数不是虚的,则只会调用基类的析构函数,派生类部分可能无法正确释放资源。所以,只要一个类可能被继承,就应该将它的析构函数声明为虚函数(即使为空)。

8. 继承与组合:is-a 与 has-a


面向对象设计中有一个重要的准则:多用组合,少用继承。

继承表达的是“是一种”关系:Dog 是一种 Animal,所以用继承。

组合表达的是“有一个”关系:Car 有一个 Engine,所以把 Engine 作为 Car 的成员对象。

如果不加区分地滥用继承,会导致耦合过强,代码难以维护。比如,想让 Bird 具有飞翔的能力,如果直接用继承,可能会写出 FlyingBird 类,但随着需求变化(鸡也是鸟但不能飞,飞机不是鸟但能飞),继承层次会变得混乱。此时更好的方式是将“飞翔”抽象成一个接口(纯抽象类),如 IFlyable,然后让需要飞翔的类继承这个接口。这实际上是一种组合设计——实现多个接口。

9. 多重继承


C++ 支持从多个基类同时继承(多重继承),语法如下:

class A { ... };
class B { ... };
class C : public A, public B { ... };


多重继承容易引发菱形继承问题(两个基类有共同的祖父类,派生类会包含两份祖父部分),C++ 提供了虚继承来解决,但整体较复杂。多数项目会通过接口(纯抽象类)来规避多重继承的复杂性。

10. 常见误区与注意事项


忘记虚析构函数
凡是作为基类的类,析构函数应该写成 virtual ~Base() {} 或 virtual ~Base() = default;,否则通过基类指针删除派生对象会导致资源泄漏。

隐藏而非重写
派生类定义了与基类同名的非虚函数,不会产生多态,只是隐藏。一定要区分“重定义(隐藏)”和“重写(覆盖)”。

重写时缺少 override
不写 override,函数签名稍有不同就会变成隐藏而非重写,且编译器不提示错误,排查困难。养成重写时加 override 的好习惯。

protected 的使用
不要为了派生类方便把不该暴露的成员设为 public,可以设为 protected 对外隐藏,但也要考虑 protected 破坏封装的程度,尽量保持数据成员的 private,通过 protected 成员函数提供受控访问。

派生类对象切片
如果把派生类对象赋值给基类对象(不是指针或引用),会发生对象切片,只保留基类部分,派生类特有的部分被切掉,且多态失效。

11. 小结


1.继承是实现代码复用和多态的基础,表达“is-a”关系。

2.派生类以 public 继承基类,可以访问 public 和 protected 成员,不能直接访问 private 成员。

3.构造顺序:基类 → 派生类成员 → 派生类构造体;析构顺序相反。

4.通过 virtual 虚函数实现多态,用基类指针/引用调用派生类重写的函数。

5.重写虚函数请加 override,基类析构函数务必为虚函数。

6.纯虚函数让类变成抽象类,抽象类不能实例化。

7.优先使用组合,继承只在确实满足“is-a”关系时使用。

C++ 继承深度解析:面向对象编程的核心特性 继承是面向对象编程(OOP)中一个重要的机制,它允许一个类(派生类)继承另一个类(基类)的成员(属性和方法)。继承有助于代码复用和逻辑组织,使得程序具有更强的扩展性和可维护性。在 C++ 中,继承遵循"is-a"关系。即:如果类 B 从类 A 继承,那么 B 是 A 的一种特殊类型。例如,Cat类可以继承Animal类,因为猫是动物的一种。继承是 C++ 面向对象编程的基石之一,它提供了代码复用、扩展性和抽象能力。然而,继承并不是一个万能的工具,过度使用继承可能导致设计复杂化、耦合度过高和维护困难。 阅读详情

相关推荐

C++面向对象编程三大特性之一:继承

作为C++面向对象编程的三大核心特性(封装、继承、多态)之一,继承是构建复杂软件系统的基石。掌握继承不仅需要理解语法规则,更需要在实际项目中积累经验,根据具体需求合理设计类层次结构。注意:本文中的代码示例主要用于说明概念,实际开发中可能需要添加错误处理和其他边界条件检查。派生类自动获得基类的属性和方法,同时可以添加自己特有的成员或修改继承来的行为。:派生类中成员的访问权限 = min(基类中的权限, 继承方式)当派生类定义了与基类同名的成员(变量或函数)时,基类的成员会被。派生类对象的构造遵循。

2202_75382767的博客 938

轻松掌握C++继承:面向对象编程的核心技巧

本文介绍了C++中继承的概念与应用,重点阐述了继承作为代码复用机制的本质。通过"苹果是水果"的例子说明继承关系,并详细讲解继承的基本语法(public/protected/private继承方式)和实现示例(Shape基类与Circle派生类)。文章还探讨了继承中的注意事项(成员隐藏、友元关系、赋值兼容性)、多继承的优缺点及虚继承的解决方案。最后推荐了系统学习继承的视频教程资源,帮助开发者深入理解面向对象编程的核心概念。全文内容详实,适合有一定C++基础的读者提升编程能力。

2501_91832086的博客 463

20、探索C++中的继承:面向对象编程的核心

本文深入探讨了C++中的继承概念及其在面向对象编程中的核心作用,包括IS_A和HAS_A关系、继承的实现方法、虚函数的使用以及继承的局限性和优化技巧。通过实际案例分析,展示了继承在GUI库、数据库操作和游戏开发等场景中的应用,并提供了优化继承结构的方法如抽象类、接口类和模板类的使用。

x2y3z4a5b的博客 485

【C++】面向对象编程的三大特性:深入解析继承机制

本文将深入解析面向对象编程的三大核心特性,特别是对继承机制的详细探讨。通过对这些概念的优化理解,帮助读者更好地掌握面向对象编程的精髓。

专注于 C/C++ 后端开发,涵盖基础语法、Linux系统与网络、MySQL数据库、常见算法及项目经验。 3709

深入掌握C++面向对象编程技巧

面向对象技术(Object-Oriented Technology,OOP)自20世纪60年代诞生以来,已经成为现代编程语言中不可或缺的一部分。OOP的核心是利用对象、类、继承和多态等概念,模拟现实世界中的事物及其相互关系。它的出现简化了大型复杂系统的开发流程,提高了代码的可读性和可维护性,同时也方便了代码的重用和扩展。类是面向对象编程的核心,它定义了一组具有相同属性和服务的对象的蓝图。在C++中,类由关键字class后跟类名和一对花括号内定义的数据成员和成员函数组成。

weixin_42430341的博客 985

windows10家庭版输入loadrunner注册码时报“License security violation. Operation isnot allowed”的解决办法

有可能出现2个错误第一个可能是第二个可能是“License security violation. Operation isnot allowed”ok,在此我在百度找了很多方法,大部分的方法都是删除注册表,但我根本就找不到这个注册表,而后又是管理中心找本地用户和组,但我依旧找不到这个玩意,然后可能是windows10家庭版本来就没有这个。再然后又以管理员身份去运行填写,好的,依旧报错,依旧未解决...

qq_30990097的博客 2558

c++:封装、继承、多态

封装是面向对象编程中的一种重要概念,它将数据和操作封装在一起,形成一个“黑盒子”,对外部只暴露必要的接口,隐藏内部实现细节。C++通过类(Class)来实现封装,其中包括私有成员(Private)、保护成员(Protected)和公有成员(Public)等访问控制修饰符。私有成员只能在类内部访问,保护成员可以在类及其子类中访问,公有成员可以在任何地方访问。首先,在介绍封装前,应该要知道类和对象这么一个事,什么是类和对象?

嵌入式小企鹅的博客 4150

【ISAR成像定标方法(1)—转台目标的RD成像算法MATLAB仿真】

ISAR成像定标方法的研究具有重要意义,但是与之相关的学习资料以及仿真对于小白来说很难找或者很杂乱,本人作为小白之一在研究过程中苦不堪言,现在自己所要研究的定标内容已经完成,以后还学不学雷达也不一定,因为后面的路更难,现在打算把一些相关推导和仿真结果列出来,以供小白交流学习使用,希望能有点帮助。(PS:由于公式和符号的原因,采用图片形式说明)

此木旧年的博客 6416

C++类与继承:面向对象编程的核心机制

面向对象编程(OOP)是现代软件开发的基础范式,其核心概念封装、继承和多态构成了构建复杂系统的三大支柱。C++作为支持OOP的代表性语言,通过class关键字实现数据与行为的封装,使用继承机制建立类之间的层次关系。访问控制(public/protected/private)实现了信息隐藏,而构造函数与析构函数管理着对象的生命周期。多继承虽然强大但需谨慎使用,虚继承可解决菱形继承问题。在实际工程中,合理运用继承能显著提升代码复用率,遵循LSP原则可避免脆弱的基类问题。现代C++新增的override和fina

weixin_30932215的博客 739

手把手教你用WKT文件在Petrel中创建自定义坐标系统(附CGCS2000转换模板)

本文详细介绍了如何在Petrel软件中利用WKT文件创建自定义坐标系统,并重点提供了CGCS2000坐标系的完整转换模板与实战步骤。通过解析坐标系统的三大支柱(大地坐标系、投影坐标系、基准转换)和WKT文件结构,指导用户从零开始构建适用于本土化项目的坐标系统,确保地质建模与空间数据处理的精度与一致性。

gpt4scribbler的博客 277

手把手教你理解ARM SoC中的PPU:电源管理IP的配置与实战避坑指南

本文深入解析ARM SoC中的PPU(Power Policy Unit)电源管理IP,提供详细的配置指南与实战避坑技巧。从PPU基础架构、寄存器配置到与PCSM的协同工作,全面介绍如何优化电源管理策略,解决常见配置误区,并分享高级调试与性能优化方法,助力工程师提升低功耗SoC设计效率。

weixin_28693447的博客 479

C++面向对象编程实战:继承与派生全解析

本文深入解析C++面向对象编程中的继承与派生机制,涵盖单继承、多继承、类组合等核心概念。通过代码示例展示了构造函数调用顺序、同名成员隐藏、类型转换等关键特性。文章对比了继承与组合的优缺点,强调优先使用组合的设计原则,并详细说明了多继承中的命名冲突解决方案。最后还探讨了类层次结构中的类型转换规则,为构建合理的类体系提供实用指导。

Despacito0o的博客 1733

CesiumForUnreal实现鹰眼地图(MiniMap)效果

CesiumForUnreal实现鹰眼地图(MiniMap)效果

专注GIS开发 3951

C++ 继承:面向对象编程的核心概念(一)

在上面的代码中,我们看到没有继承的类Student 和 Teacher,Student 和 Teacher都有一部分相同的成员和函数(_name、_address、_tel、_age、identity),这部分函数分别实现在两个类里面是冗余的。一般都需要显示写继承方式。派生类和基类中有同名成员时,派生类将屏蔽基类对派生类同名成员的访问,这种情况叫隐藏。方法1:基类的构造函数私有,派生类的构成必须调用基类的构造函数,但是基类的构成函数私有化以后,派生类看不见就不能调用了,那么派生类就无法实例化出对象。

2302_80836956的博客 1045

ARFoundation系列讲解-教程目录

一、教程目录 ARFoundation快速入门-01简介 ARFoundation快速入门-02环境搭建 ARFoundation快速入门-03环境配置之iOS ARFoundation快速入门-04环境配置之Android ARFoundation快速入门-05ARKit设备支持列表 ARFoundation快速入门-06ARCore设备支持列表 ARFoundation快速入门-07检查设备支持 ARFoundation快速入门-08平面检..........

a451319296的博客 3万+

危废焚烧优化控制系统设计与实现:基于数据驱动的控制参数预测

本文提出了一种基于数据驱动的危险废物焚烧过程优化控制方法。系统利用历史运行数据和实时监测数据,通过深度学习模型预测关键控制参数,实现焚烧过程的智能化控制。系统采用Python开发,结合TensorFlow/PyTorch框架,构建了完整的数据采集、预处理、特征工程、模型训练和实时预测闭环系统。该系统能够处理多变量非线性关系,适应工况变化,从历史数据中学习最优控制策略,相比传统PID控制方法具有显著优势。论文详细介绍了系统架构、算法设计和实现细节,为危废焚烧过程的优化控制提供了有效解决方案。

huanghm88的专栏 206

如何掌握C++面向对象编程:CPP-Crash-Course终极指南

面向对象编程(OOP)是C++语言的核心特性,也是从C程序员成功转型为C++开发者的关键所在。CPP-Crash-Course项目为C程序员提供了一个完整而实用的C++速成教程,特别专注于**C++类与对象**的深度解析。本文将带你深入了解这个优秀的开源项目,掌握C++面向对象编程的核心概念和实践技巧。 ## 📚 CPP-Crash-Course项目概述 CPP-Crash-Course是一

gitblog_00023的博客 550

对角两对双差速轮AGV的平移、直行、转弯和原地旋转之PID控制

本示例将展示如何使用PID控制算法,控制具有对角线布置的两对双差速轮(左前和右后)的AGV,实现平移、直行、转弯和原地旋转等运动。通过对车辆的运动学和PID控制器的设计,我们可以精确地控制AGV的运动

xiaoc100200的博客 1510

【C++核心篇】—— C++面向对象编程:继承、多态的相关语法和使用的详解,回顾学习看这一篇就足够了!!!

在本篇文章中,主要是对C++的基础语法进行回顾学习,回顾学习C++的基本语法规则、数据类型、控制结构以及面向对象编程的基本思想。

2401_82458959的博客 1638

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

继承与组合:C++面向对象的核心

C++继承机制详解:本文深入讲解了C++面向对象编程中的继承概念,包括基础语法、访问权限控制、基类与派生类对象转换、作用域隐藏问题以及派生类默认成员函数规则等核心知识点。通过丰富的代码示例,重点剖析了继承的本质是代码复用与功能扩展,详细说明了三种继承方式(public/protected/private)的权限差异,并强调了实际开发中应优先使用public继承。文章还特别提醒了继承中容易出现的陷阱,如同名成员导致的隐藏问题、对象切片转换规则等,为开发者提供了全面的继承技术指南和实践建议。

zrt123456i的博客 1245

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【C++面向对象编程】四大基本特性之二:继承

在C++面向对象编程中,继承是四大基本特性(封装、继承、多态、抽象)之一,它允许我们定义一个新类(派生类或子类)来继承另一个类(基类或父类)的属性和方法。这种机制极大地提高了代码的复用性,并使得程序结构更加清晰和易于维护。

byte轻骑兵的技术小窝 1684

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++继承机制:面向对象编程的基石

本文介绍了C++继承机制的核心概念,包括继承定义(public/protected/private)、基类派生类转换规则、作用域隐藏问题、派生类默认成员函数实现要点。重点分析了菱形继承问题和虚继承解决方案,比较了继承(is-a)与组合(has-a)的差异,指出组合优于继承的设计原则。文章通过大量代码示例详细说明了继承的访问控制变化、成员初始化顺序、静态成员特性等关键知识点,为面向对象编程中的代码复用提供了系统性的指导。

m0_65245374的博客 3659

《C++ 继承》三大面向对象编程——继承:代码复用与功能扩展的核心机制

本文深入探讨C++继承机制的核心概念与应用。首先介绍了继承的优势,包括代码复用和功能扩展,通过类体系设计案例演示了公共成员提取到基类的实现方式。重点讲解了继承语法、访问权限九种组合变化及类模板继承应用。其次剖析了类型转换规则,包括派生类向基类的赋值、引用/指针绑定等特殊情况。在作用域规则部分,详细解析了同名成员隐藏机制及处理策略。最后系统阐述了派生类默认成员函数生成机制,特别强调构造函数和析构函数的调用顺序及注意事项,并指出多态环境下析构函数可能存在的陷阱。通过理论与实践结合,全面展示了继承在构建面向对象系

心向往之,行必能至 872

【C++】继承机制:面向对象编程的核心奥秘

摘要:本文系统介绍了面向对象编程中的继承机制。继承允许派生类复用基类的成员(数据和函数),形成层次结构。文章详细阐述了三种继承方式(public、protected、private)对成员访问权限的影响,指出基类private成员在任何继承方式下都不可见。

2402_83411382的博客 1161

从理论到实践:如何通过CPP-Crash-Course快速掌握C++编程技巧

**CPP-Crash-Course**是一个专为C程序员设计的C++快速入门教程项目,提供从基础语法到高级特性的完整学习路径。这个开源项目通过实用的代码示例和清晰的解释,帮助开发者快速从C语言过渡到现代C++编程,掌握面向对象编程、模板、异常处理等核心概念。无论你是刚接触C++的新手,还是希望系统复习C++知识的开发者,这个项目都能为你提供有价值的参考。 ## 📚 项目概述与核心价值 CP

gitblog_00617的博客 494

继承(Inheritance)是面向对象编程的核心

根据前面继承介绍,小编也对继承做了自己的总结。由于继承是 C++ 面向对象编程的核心机制之一,它允许创建层次化的类结构,实现代码复用、多态性和抽象设计。

weixin_50881329的博客 1264
上一篇: C++容器适配器:stack与queue详解
下一篇: 掌握二叉搜索树:高效查找的基石
CCCCCCCCharlie
博客等级 码龄1年 2粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值