C++中类和对象的多态性及其基本语法讲解

简介: C++中类和对象的多态性及其基本语法讲解

在C++中,多态性是面向对象编程的三大特性之一,它允许我们使用父类类型的指针或引用来调用子类的成员函数。多态性主要分为两种:编译时多态(通过函数重载和模板实现)和运行时多态(通过虚函数和指针或引用实现)。这里我们主要讨论运行时多态,它通常涉及到虚函数和动态绑定。

 

1. 虚函数

虚函数是C++中实现多态性的关键。当基类中的成员函数被声明为虚函数时,派生类可以重写该函数。在运行时,程序会根据对象的实际类型(而不是指针或引用的类型)来调用正确的函数。

 

示例代码:

image.png

image.png

讲解:

Shape 类中声明了一个虚函数 draw,这意味着 Shape 的派生类可以重写这个函数。

Circle 和 Rectangle 类继承了 Shape 类,并各自重写了 draw 函数。

drawShapes 函数接受一个 Shape 指针数组,并调用每个指针的 draw 函数。由于 draw 是虚函数,这里实际调用的是指针所指向对象的 draw 函数实现,即多态性发生。

main 函数中创建了 Circle 和 Rectangle 的对象,并将它们的地址存储在 shapes 数组中。然后调用 drawShapes 函数来绘制这些形状。

注意,当我们使用动态分配的对象时(如本例中的 new 操作符),必须在不再需要这些对象时显式释放它们(使用 delete 操作符)。否则会导致内存泄漏。

2. 纯虚函数和抽象类

如果一个类包含纯虚函数,那么这个类就是抽象类。抽象类不能被实例化,通常用作接口,定义一组需要由派生类实现的操作。

 

示例代码:

image.png

讲解:

AbstractShape 类中声明了一个纯虚函数 draw,由于 = 0 的存在,AbstractShape 成为一个抽象类。

Circle 类继承了 AbstractShape 并提供了 draw 函数的实现。

在 main 函数中,我们不能直接实例化 AbstractShape,因为它是一个抽象类。但我们可以实例化 Circle,因为 Circle 提供了所有纯虚函数的实现。

通过

目录
相关文章
|
12天前
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
35 13
|
4天前
|
存储 编译器 C语言
【C++基础 】类和对象(上)
【C++基础 】类和对象(上)
|
17天前
|
编译器 程序员 C++
C++一分钟之-属性(attributed)与属性语法
【6月更文挑战第28天】C++的属性为代码添加元数据,帮助编译器理解意图。C++11引入属性语法`[[attribute]]`,但支持取决于编译器。常见属性如`nodiscard`提示检查返回值,`maybe_unused`防止未使用警告。问题包括兼容性、过度依赖和误用。使用属性时需谨慎,确保团队共识,适时更新以适应C++新特性。通过示例展示了`nodiscard`和`likely/unlikely`的用法,强调正确使用属性能提升代码质量和性能。
34 13
|
12天前
|
数据安全/隐私保护 C++
|
12天前
|
编译器 C++
【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
📚 C++ 知识点概览:探索类的`static`成员、友元及应用🔍。
|
12天前
|
算法 C++ 容器
|
12天前
|
存储 安全 编译器
|
17天前
|
存储 编译器 C++
【C++】类和对象④(再谈构造函数:初始化列表,隐式类型转换,缺省值
C++中的隐式类型转换在变量赋值和函数调用中常见,如`double`转`int`。取引用时,须用`const`以防修改临时变量,如`const int& b = a;`。类可以有隐式单参构造,使`A aa2 = 1;`合法,但`explicit`关键字可阻止这种转换。C++11起,成员变量可设默认值,如`int _b1 = 1;`。博客探讨构造函数、初始化列表及编译器优化,关注更多C++特性。
|
17天前
|
编译器 C++
【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 )
本文探讨了C++中类的成员函数,特别是取地址及const取地址操作符重载,通常无需重载,但展示了如何自定义以适应特定需求。接着讨论了构造函数的重要性,尤其是使用初始化列表来高效地初始化类的成员,包括对象成员、引用和const成员。初始化列表确保在对象创建时正确赋值,并遵循特定的执行顺序。
|
17天前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。