c++ 实现多态 virtual 虚函数的使用 c weak

有这么一种使用场景,一个新时代农民工要做一种库给别人使用

默认帮助客户实行了一套逻辑,按照码农自己的理解搬砖需要自己用手搬

比如    void 搬砖(){ std::cout << "搬砖需要用手搬" ;}

可是    客户想,现在都啥时代了,你们自己卷去,我得用机器搬,最好AI搬

那交互过来的代码怎么办呢,自己坚持要用手搬,还得满足客户的要求!

如果在C语言中,可以这样实现   用weak  标明码农自己的方法是弱鸡

__weak void 搬砖(){ std::cout << "搬砖需要用手搬" ;}

那客户拿过来,只要重写下这个函数就可以了,买了最新AI搬砖机器人 实现:

void 搬砖(){ std::cout << "搬砖需要用AI搬" ;}

编译器编译的时候发现有了weak 在另外还有实现搬砖这个方法,就会去掉弱鸡方法,只保留好壮壮的方法,这样就能适应各种复杂多变的需求。

如果开发过stm32之类的嵌入式程序,很多HAL库,都是这么实现的,SDK保留默认的  ,用户根据需求,可以自己实现 

-----------------------------------------------------------------------------------------------------------------

C都出现这么多年了   那么在高级语言中呢?  更晚的C++ C#  virtual 虚函数出现了

这2兄弟感觉也真是好  ,一个弱  一个虚的 ,总之就是让别人霸凌的对象,别人强了自己就让步,按照别人的方式做  。 

可就是这么个柔弱的东东,构成了  (封装  继承  多态) 三座大山中的重要一山

为大型系统的灵活和扩展性奠定了重要

<think>我们正在处理用户关于C++虚函数智能指针的请求。首先,我们需要组织答案,确保结构清晰,并涵盖两个主题:虚函数智能指针。同时,根据引用内容,我们可以整合关于虚函数的信息,并补充智能指针的内容。 计划: 1. 虚函数部分:根据引用[1][2][3][4]解释虚函数多态虚函数表、纯虚函数等。 2. 智能指针部分:由于引用中没有提供智能指针的信息,我们将独立介绍三种智能指针:unique_ptr, shared_ptr, weak_ptr。 3. 使用示例:提供简单的代码示例说明虚函数智能指针的使用。 4. 生成相关问题。 注意:按照要求,行内数学表达式用$...$,独立公式用$$...$$(但本主题可能数学公式较少,如果有则按规则处理),使用中文回答,并在引用的地方添加引用标识。 由于引用内容主要涉及虚函数,因此智能指针部分需要依靠自己的知识。 结构: 一、虚函数 1. 概念与作用 2. 虚函数表(vptr)动态绑定 3. 纯虚函数与抽象类 4. 虚函数使用注意事项 二、智能指针 1. 智能指针概述(为什么需要智能指针?) 2. unique_ptr 3. shared_ptr 4. weak_ptr 三、代码示例(结合虚函数智能指针) 四、相关问题 开始编写:</think>### C++ 虚函数与智能指针详解 #### 一、虚函数 **1. 核心概念** 虚函数实现动态多态的基础,允许在运行时根据对象实际类型调用对应函数。通过`virtual`关键字声明: ```cpp class Base { public: virtual void func() { cout << "Base" << endl; } // 虚函数 }; ``` 当派生类重写虚函数时,通过基类指针调用会执行派生类的实现: ```cpp class Derived : public Base { public: void func() override { cout << "Derived" << endl; } }; int main() { Base* obj = new Derived(); obj->func(); // 输出 "Derived"(动态绑定) delete obj; } ``` **2. 实现机制** - **虚函数表(vtable)**:每个含虚函数的类在编译时生成虚函数表,存储虚函数地址[^3]。 - **虚表指针(vptr)**:对象创建时自动初始化,指向类的虚表。 - **动态绑定**:运行时通过`vptr`查找虚表,确定实际调用的函数地址[^4]。 **3. 纯虚函数与抽象类** ```cpp class Abstract { public: virtual void pureFunc() = 0; // 纯虚函数 }; ``` - 含纯虚函数的类为抽象类,**不能实例化** - 派生类必须实现所有纯虚函数才能实例化[^1] **4. 关键限制** - 构造函数不能是虚函数(因`vptr`在构造期间初始化)[^3] - 静态函数友元函数不能为虚函数 - 虚函数默认使用动态绑定,可通过`类名::函数名`强制静态绑定 #### 二、智能指针 **1. 设计目的** 解决动态内存手动管理问题(内存泄漏、悬垂指针),基于RAII(资源获取即初始化)原则自动释放资源。 **2. 核心类型** | 类型 | 所有权模型 | 特点 | |---------------|------------------|-------------------------------| | `unique_ptr` | 独占所有权 | 轻量高效,不可复制 | | `shared_ptr` | 共享所有权 | 引用计数,支持复制 | | `weak_ptr` | 无所有权 | 解决`shared_ptr`循环引用问题 | **3. 使用示例** ```cpp // unique_ptr(独占资源) auto uptr = make_unique<int>(10); // shared_ptr(共享资源) auto sptr1 = make_shared<int>(20); auto sptr2 = sptr1; // 引用计数+1 // weak_ptr(观察资源) weak_ptr<int> wptr = sptr1; if (auto tmp = wptr.lock()) { // 检查资源存在 cout << *tmp << endl; } ``` **4. 虚函数与智能指针结合** ```cpp class Base { public: virtual ~Base() = default; // 虚析构函数(必需!) }; class Derived : public Base { /*...*/ }; int main() { shared_ptr<Base> ptr = make_shared<Derived>(); // 正确调用Derived的析构函数 } ``` > ⚠️ **关键**:基类必须有虚析构函数,否则通过基类指针删除派生类对象时行为未定义[^1]。 #### 三、性能与注意事项 1. **虚函数开销** - 每次调用需查虚表(约多1-2条指令) - 对象需额外存储`vptr`(通常4/8字节) 2. **智能指针开销** - `shared_ptr`需维护引用计数(原子操作) - `weak_ptr`不增加引用计数 3. **最佳实践** - 优先用`make_unique`/`make_shared`代替`new` - 避免循环引用(用`weak_ptr`打破) - 多态基类必须声明虚析构函数 --- ### 相关问题 1. 虚函数表在多重继承中如何布局? 2. `shared_ptr`的引用计数机制如何保证线程安全? 3. 什么场景下应优先使用`unique_ptr`而非`shared_ptr`? 4. 如何通过`typeid``dynamic_cast`实现运行时类型识别(RTTI)?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值