黑马程序员-OC语言-多态、代理

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

  • 开场白:多态是C语言的概念,代理是OC的概念,多态作为面向对象三大特性之一,重要性可见一斑,代理也更不可小视。

  • 为什么要把它们放到一起来说?因为我对它们在概念性和功能性上有点混淆。今天就把要它们说清楚了,解决这场纠纷!


多态:不同的对象以不同的方式响应相同名称方法的能力称为多态 (也就是一个方法有多种状态,多种状态体现在子类对父类方法重写中)


话说:有一个消防员(Fireman)类、一个医生(Doctor)类,都继承自人类(Person)

消防员类:save方法(灭火)
医生类:save方法(输液)
人类:在这代表上帝

@interface Person:NSObject
@end
@implementation Person
@end
@interface Fireman:Perosn
@end
@implementation Fireman
-(void) save;
@end
@interface Doctor:Person
@end
@implementation Doctor
-(void) save;
@end
Person *p1=[Doctor new];//Doctor是Person的子类
person *p2=[Fireman new];//Fireman是Person的子类
[(Doctor *)p1 save];
[(Fireman *)p2 save];
  • 编译时,编译器会检查指针p1、p2的类型(Person)有没有这个方法,如果有,不报错;如果没有,报错。(强制类型转换会避过这一步)
  • 运行时,会检查p1\p2指针的真正类型(Doctor、Fireman)有没有这个方法,如果有,不报错;如果没有,报错。
  • 所有的强制类型转换都是临时的。

多态存在的意义:

  1. 简化了编程接口。类和类之间可以重用一些习惯性的命名。这样,编程接口就是一些抽象的行为的集合
  2. 代码扩展性和复用性更好。
  3. 方法多样性
  4. 高聚合性和低耦合性

代理:让别人代替你去做事,代替你完成任务的对象,就是你的代理。

协议:

@protocol LaunchProtocol <NSObject>
-(void) shoot;
@end

人类:


@interface Person : NSObject
@property(nonatomic,strong) id<LaunchProtocol> delegate;
-(void) launch;
@end

@implementation Person
{
    NSLog(@"扣动扳机~~~");
    if (self.delegate!=nil) 
    {
        [self.delegate shoot];
    }
}
@end

枪类:(遵守LaunchProtocol协议)

@interface cf : NSObject<LaunchProtocol>
@end

@implementation Gun
-(void) shoot
{
    NSLog(@"biu  biu   11biu");
}
@end

main函数

Person *p=[Person new];
Gun *gun=[Gun new];
p.delegate=gun;
[p launch];//person类只有扣动扳机的方法,没有发射的方法,发射的方法就找到了枪去做。

代理存在的意义:

1.拓展了功能和方法
2.高聚合性和低耦合性


自己的一些思考:代理没有继承关系,通常A知道什么是什么时候做事,但不知道怎么做,而B知道怎么做却不知道什么时候做,让AB合作,在正确的时间做正确的事。
多态是多个子类相应一个方法,主要作用是:简化编程接口,提高代码扩展性。
都实现高聚合低耦合。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
<think> 首先,用户的问题是:“我想确认B站黑马程序员的C++课程中多态电脑组装案例是否少写了虚析构。请问B站黑马程序员C++课程多态电脑组装案例是否少写了虚析构?” 用户提到了“多态电脑组装案例”,但在系统级指令中提供的引用中没有直接提到这个案例。引用[1]讨论的是纯虚析构函数多态,引用[2]是多态案例二-制作饮品,引用[3]是虚继承的示例。用户似乎是在引用B站黑马C++课程的内容。 在引用[1]中,有纯虚析构函数的语法:`virtual ~类名() = 0;` 实现 `类名::~类名() {}`。这暗示了在多态中基类应该有虚析构函数的重要性。 用户问的是“多态电脑组装案例”是否少写了虚析构函数。这意味着在这个案例中,基类可能没有定义虚析构函数,导致在使用多态时可能有问题。 回顾C++知识:当使用多态时,如果基类的指针指向派生类的对象,并通过基类指针删除对象,如果基类的析构函数不是虚的,那么只会调用基类的析构函数,而派生类的析构函数不会被调用,这会导致资源泄漏。因此,在基类中定义虚析构函数是重要的。 在提供的引用中: - 引用[1] 强调了纯虚析构函数的使用。 - 引用[2] 的多态案例中,`Base`类有纯虚函数 `virtual void func() = 0;`,但没有提到析构函数。 - 引用[3] 是关于虚继承,与析构函数无关。 用户可能指的是课程中的某个具体案例“电脑组装”,但引用中没有这个案例的描述。我需要基于一般知识来回答。 系统级指令要求: - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,逐步解决问题。 - 保证回答真实可靠。 由于引用中没有“电脑组装案例”的具体代码,我不能直接确认是否少写了虚析构函数。但基于多态的原则,我应该解释为什么虚析构函数重要。 结构回答: 1. 解释多态中虚析构函数的重要性。 2. 参考提供的引用来支持。 3. 讨论可能的缺失。 4. 给出建议。 5. 生成相关问题。 步骤: - 先确认问题:用户想知道在某个案例中是否少写了虚析构函数。 - 由于没有代码,我可以说一般原则:在多态基类中,析构函数应该是虚的。 - 在引用[1]中,提到了纯虚析构函数,这可以用于抽象类。 - 在案例中,如果基类是抽象类,并且没有虚析构函数,那可能是问题。 在引用[2]的代码中: ```cpp class Base { public: virtual void func() = 0; // 纯虚函数 // 没有虚析构函数 }; ``` 在`test01`中,有`delete base;`,但基类没有虚析构函数。这会导致问题,因为`base`指向`Son`对象,但`Base`的析构函数不是虚的,所以`Son`的析构函数不会被调用。 在引用[2]的代码中,确实少写了虚析构函数。这可能会导致内存泄漏或未定义行为。 类似地,在“电脑组装案例”中,如果结构类似,可能也少写了。 用户提到“电脑组装案例”,但没有提供代码。我需要基于上下文推断。 在回答中: - 指出在多态案例中,基类应该定义虚析构函数。 - 参考引用[1]中的纯虚析构函数语法。 - 建议检查代码。 最终回答: - 是的,根据多态原则,在基类中应该定义虚析构函数。 - 在引用[2]的案例中,也少写了。 生成相关问题: 1. 为什么在多态中需要虚析构函数? 2. 如何修复多态案例中的资源泄漏问题? 3. 纯虚析构函数普通虚析构函数有什么区别? 引用添加:在提到引用时添加[^1]等。 </think> 基于您的问题,我将结合C++多态的基本原则提供的引用内容,逐步分析B站黑马程序员C++课程中的多态电脑组装案例是否可能少写虚析构函数。由于我无法直接访问该课程的具体代码,以下分析基于C++标准规范、多态机制的必要性,以及引用中提供的示例(如多态案例二)进行推断。 ### 步骤分析 1. **多态中虚析构函数的作用** 在C++中,当使用基类指针指向派生类对象并通过该指针删除对象时,如果基类的析构函数不是虚函数(`virtual`),则只会调用基类的析构函数,而派生类的析构函数不会被调用。这会导致派生类中分配的资源(如内存、文件句柄等)泄漏,引发未定义行为或程序崩溃[^1]。 例如: - 基类指针 `Base* ptr = new Derived();` - 执行 `delete ptr;` 时,若基类析构函数非虚,则 `Derived` 的析构函数不会执行。 2. **引用中的关键信息** - 引用[1]明确强调纯虚析构函数的语法必要性: ```cpp virtual ~类名() = 0; // 类内声明 类名::~类名() {} // 类外实现 ``` 这适用于抽象基类(包含纯虚函数),确保派生类对象被删除时正确调用析构链[^1]。 - 引用[2]的多态案例(制作饮品)中,基类 `Base` 定义了纯虚函数 `virtual void func() = 0;`,但**未声明虚析构函数**: ```cpp class Base { public: virtual void func() = 0; // 纯虚函数,但析构函数缺失 }; ``` 在 `test01()` 中通过基类指针 `delete base;` 删除派生类对象时,若 `Base` 无虚析构函数,会导致资源泄漏风险[^2]。 - 引用[3]的虚继承案例不涉及析构函数问题,但进一步印证多态需谨慎处理基类设计。 3. **对“电脑组装案例”的推断** - 典型的多态电脑组装案例通常涉及: - 基类(如 `Component`),派生类(如 `CPU`、`GPU`)。 - 通过基类指针管理派生类对象(如 `Component* comp = new CPU();`)。 - 如果该案例的基类**未声明虚析构函数**,则与引用[2]的案例类似,存在以下问题: - 派生类对象被删除时,仅调用基类析构函数,派生类的资源未释放。 - 违反C++多态的安全实践(基类析构函数应为虚函数)。 - **结论**:根据引用[1][^1][2][^2]的原则,该案例很可能少写了虚析构函数,需检查基类是否包含 `virtual ~Component();` 或类似声明。 ### 修复建议 若课程代码中缺失虚析构函数,可参考以下方式修复: ```cpp class Component { // 基类(如电脑组件) public: virtual void assemble() = 0; // 纯虚函数 virtual ~Component() = default; // 添加虚析构函数(或使用纯虚析构,需类外实现) }; // 派生类示例 class CPU : public Component { public: void assemble() override { /* 实现组装逻辑 */ } ~CPU() { /* 清理CPU特有资源 */ } }; // 使用示例 Component* comp = new CPU(); comp->assemble(); delete comp; // 正确调用CPUComponent的析构函数 ``` - **关键点**: - 虚析构函数确保 `delete comp` 时调用 `CPU::~CPU()` `Component::~Component()`。 - 若基类是抽象类,可用纯虚析构(`virtual ~Component() = 0;`),但需类外实现 `Component::~Component() {}`[^1]。 ### 总结 - **是否少写虚析构函数?** **很可能少写**。基于引用[2]的案例模式多态的必要规范,若电脑组装案例的基类未声明虚析构函数,则属于常见疏忽,可能导致资源泄漏。建议复查课程代码,确认基类是否包含 `virtual` 析构函数。 - **根本原则**:在涉及多态删除(`delete` 基类指针)的场景中,基类析构函数必须为虚函数[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值