9.多态

多态

一:

1.什么是多态?

:

同一父类类型,调用其同一方法后,表现出不同的状态,称为多态

2.什么时候使用多态?

:

当程序业务有变更时,增加代码的同时,还需要修改原有代码,带来大量的工作量 解决办法:使用多态

3.多态的特点:

父类:定义一个虚方法(没有方法体的方法)
子类:重写父类中的虚方法

4.多态的实现方式及区别:

  • ①:方法重载:
    用静态的方式实现多态,在程序编译的过程中,重载的方法就已经确定,重载的若干个方法同时加载到内存中,在执行时,根据参数的情况决定调用哪一个方法
  • ②:方法重写/方法覆盖:
    在编译及内存加载时,子类的方法并没有覆盖掉父类中被重写的方法,只有在调用过程中,判断是哪个子类调用的,然后用这个子类中的方法区覆盖父类中的方法.
    由于参数的类型是父类类型,所以调用的是父类中的方法,根据具体传递的实参,实参是哪个子类的类型,就用这个子类中的方法区覆盖掉父类中的虚方法

二:

多态的使用步骤:

  • :在父类中编写共同的方法,但方法体为空的虚方法
		public void eat(){

		}
  • :在子类中重写父类中的虚方法
  • :在使用时,用父类做类型,具体使用子类对象

里氏替换原则LSP:任何父类出现的位置,都可以使用其子类对象进行替换,方法的参数是父类类型,传递实参时,可以传递其子类对象


三:多态的应用:

对象数组

	Pet[] arr = new Pet[10];
		
		Dog dog = new Dog();
		dog.setName("狗狗");
		dog.setAge(5);
		dog.setSex('公');
		dog.setStrain("泰迪");
		
		Cat cat = new Cat();
		cat.setAge(2);
		cat.setName("猫猫");
		cat.setSex('母');
		cat.setColor("彩色");
		
		Pig pig = new Pig();
		pig.setName("猪猪");
		pig.setAge(3);
		pig.setSex('母');
		pig.setLoad(200);
		
		arr[0] = dog;
		arr[1] = cat;
		arr[2] = pig;
<think>嗯,用户这次的问题很实际,是想了解在Qt开发中C++各种特性的优先级。看来用户是个刚接触Qt的开发者,希望高效学习而不是面面俱到。用户可能正在规划学习路线,需要明确重点。 从用户引用的代码片段看,ta应该已经注意到Qt对标准C++的兼容性,但更关心实际开发中的使用频率。用户列举的特性很全面,从多态到STL容器再到算法,需要我给出实用主义的建议。 Qt开发确实有鲜明的特点:虽然基于C++,但很多传统C++特性会被Qt自有机制替代。比如字符串处理首选QString而非std::string,容器也更常用QList而非std::vector。不过核心的面向对象特性如多态仍然是基石。 用户特意提到多态,这很关键。Qt的信号槽机制本质上就是基于多态的,QObject派生类的运行时类型信息(RTTI)更是框架核心。模板虽然重要,但在Qt开发中多用于底层基础设施而非日常编码。 STL容器的选择上要特别注意:Qt的容器如QVector/QList针对信号槽传递优化过内存布局,而STL容器在跨线程传递时可能引发深拷贝问题。不过像std::map这样没有Qt直接替代品的容器仍值得学习。 算法部分,用户提到的排序算法在Qt中其实更常用qSort()而非std::sort(),因为前者能自动处理Qt容器的隐式共享。但理解算法思想对调试性能问题很有帮助。 用户没提智能指针,但这恰恰是Qt开发中容易忽略的重点。由于QObject父子对象管理机制,原始指针的使用反而比标准C++更安全,不过在新代码中仍推荐使用QScopedPointer等智能指针。 最后要注意的是,用户引用的cout示例在Qt中其实不典型——qDebug()才是Qt的日志输出首选,它不仅线程安全,还能自动处理QString等Qt类型。</think>在Qt开发中,C++特性的使用频率存在明显差异。以下是基于Qt框架特性的优先级推荐(按使用频率排序): --- ### 一、**必须优先掌握的核心特性** 1. **多态(Polymorphism)** - **使用频率:极高** ⭐⭐⭐⭐⭐ - **原因**:Qt的信号槽机制、事件处理、QObject派生类都依赖虚函数和运行时多态 - **示例**: ```cpp class MyWidget : public QWidget { Q_OBJECT protected: void paintEvent(QPaintEvent* event) override; // 重写虚函数 }; ``` 2. **STL容器:`vector` & `map`** - **使用频率:高** ⭐⭐⭐⭐ - **原因**: - `std::vector`:存储动态数据集合的首选 - `std::map`:处理键值对配置(如界面多语言翻译) - **注意**:Qt提供`QVector`/`QList`,但STL容器在算法集成时更通用 3. **字符串处理:`std::string` & Qt的`QString`** - **使用频率:极高** ⭐⭐⭐⭐⭐ - **关键点**: - **优先学`QString`**:Qt API全面使用QString(如`QObject::tr("文本")`) - `std::string`需与`QString::toStdString()`转换使用[^1] 4. **排序算法:`std::sort`** - **使用频率:中高** ⭐⭐⭐ - **场景**:对`QList`或`std::vector`排序 - **示例**: ```cpp std::vector<int> data = {5, 3, 9}; std::sort(data.begin(), data.end()); // 升序排序 ``` --- ### 二、**可延后学习的特性** 1. **类模板(Class Templates)** - **使用频率:低** ⭐⭐ - **原因**:Qt通过宏实现泛型(如`Q_DECLARE_INTERFACE`),直接使用模板的场景较少 2. **特殊容器:`deque`/`stack`/`queue`** - **使用频率:低** ⭐ - **替代方案**: - 用`QList`代替`deque` - 用`QStack`代替`std::stack` - 用`QQueue`代替`std::queue` 3. **`pair`与`tuple`** - **使用频率:低** ⭐ - **Qt方案**:用`QPair`或自定义结构体替代 4. **拷贝控制(深/浅拷贝)** - **使用频率:中** ⭐⭐ - **重点**:理解Qt的**隐式共享**(Copy-on-Write)机制,而非传统C++拷贝 --- ### 三、**Qt开发中的特性优先级矩阵 | **特性** | 使用频率 | 学习优先级 | 说明 | |--------------------|----------|------------|-----------------------------------| | 多态(虚函数) | ⭐⭐⭐⭐⭐ | 紧急 | Qt框架基石 | | `QString` | ⭐⭐⭐⭐⭐ | 紧急 | 所有文本处理的核心[^1] | | `std::vector` | ⭐⭐⭐⭐ | 高 | 通用数据存储 | | `std::map` | ⭐⭐⭐⭐ | 高 | 键值配置管理 | | `std::sort` | ⭐⭐⭐ | 中 | 配合容器使用 | | `std::list` | ⭐⭐ | 低 | 优先用`QList` | | 类模板 | ⭐ | 低 | Qt用宏实现类似功能 | | `deque`/`stack` | ⭐ | 可忽略 | Qt有专用替代类 | --- ### 四、**学习建议** 1. **首阶段重点**: - 掌握`QObject`继承体系和多态 - 熟练使用`QString`、`QList`、`QMap` - 理解信号槽机制(本质是多态的应用) 2. **次阶段补充**: - STL算法(`std::sort`, `std::find`) - `std::vector`与`QVector`的转换 3. **可暂缓内容**: - 类模板元编程 - `std::deque`等特殊容器 - 手动内存管理(Qt父子对象机制可自动处理) > **关键原则**:当Qt提供等效功能时(如`QList` vs `std::list`),优先使用Qt原生类以保证框架兼容性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值