首页 > 编程语言 >c++多态学习:多态含义与使用

c++多态学习:多态含义与使用

时间:2024-11-08 12:19:08浏览次数:7  
标签:makeSound 函数 含义 派生类 多态 c++ Animal 基类

目录

 

多态的概念

多态的定义

多态的实现

注意事项


 

多态的概念

多态是面向对象编程中的一个重要概念,它指的是同一个行为具有多个不同表现形式或形态的能力。在C++中,多态主要通过虚函数来实现,允许将子类类型的指针赋值给父类类型的指针,并在运行时根据实际对象类型调用相应的方法。

多态的定义与作用

定义:

多态意味着同一个方法或者同一个操作,对于不同的对象会产生不同的行为4。在C++中,多态是通过虚函数(Virtual Function)来实现的,虚函数是指在父类中声明的函数,在子类中可以被重写(Override),并且在运行时动态绑定(Dynamic Binding)。

作用:

多态的作用主要体现在以下几个方面:

  • 代码重用:多态允许我们在不改变父类代码的情况下,对子类进行扩展和重写,从而实现代码重用。
  • 可扩展性:通过继承和多态,我们可以很方便地添加新的子类,从而实现程序的可扩展性。
  • 可维护性:通过多态,我们可以将父类的代码和子类的代码分离,从而使程序变得更加容易维护。
  • 灵活性:多态允许我们在运行时动态绑定函数,从而实现更加灵活的程序设计。

多态的实现

多态怎么使用
多态是面向对象编程的一个重要特性,它允许使用基类指针或引用来操作派生类对象。在C++中,多态主要通过虚函数来实现。以下是使用多态的基本步骤:
 1. 定义基类和派生类
 首先,定义一个包含虚函数的基类,然后从该基类派生出其他类。

class Animal {
public:
    virtual void makeSound() const = 0; // 纯虚函数,使Animal成为抽象类
};
class Dog : public Animal {
public:
    void makeSound() const override {
        std::cout << "Woof!" << std::endl;
    }
};
class Cat : public Animal {
public:
    void makeSound() const override {
        std::cout << "Meow!" << std::endl;
    }
};


2. 使用基类指针或引用
 创建一个基类指针或引用,并将其指向派生类对象。

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    // 或者使用引用
    // Animal& animal1 = *new Dog();
    // Animal& animal2 = *new Cat();
    // ...
}


3. 调用虚函数
 通过基类指针或引用调用虚函数,实际调用的将是派生类的实现。

nt main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();
    animal1->makeSound(); // 输出 "Woof!"
    animal2->makeSound(); // 输出 "Meow!"
    delete animal1;
    delete animal2;
    return 0;
}

注意事项

4. 注意事项
虚析构函数:如果基类有虚函数,通常应该将其析构函数也声明为虚的,以确保通过基类指针删除派生类对象时能够正确调用派生类的析构函数。
纯虚函数:如果一个类包含至少一个纯虚函数(即没有实现的虚函数),那么这个类就是抽象类,不能直接实例化。
override关键字:在派生类中重写基类的虚函数时,可以使用 override 关键字来明确表示这是对基类虚函数的重写,有助于编译器进行检查。
示例代码:

#include <iostream>

class Animal {
public:
    virtual void makeSound() const = 0; // 纯虚函数
    virtual ~Animal() {} // 虚析构函数
};
class Dog : public Animal {
public:
    void makeSound() const override {
        std::cout << "Woof!" << std::endl;
    }
};
class Cat : public Animal {
public:
    void makeSound() const override {
        std::cout << "Meow!" << std::endl;
    }
};
int main() {
    Animal* animals[2];
    animals[0] = new Dog();
    animals[1] = new Cat();

    for (int i = 0; i < 2; ++i) {
        animals[i]->makeSound();
        delete animals[i];
    }

    return 0;
}


在这个示例中, Animal 类是一个抽象类,包含一个纯虚函数 makeSound 。 Dog 和 Cat 类继承自 Animal 并实现了 makeSound 函数。通过基类指针调用 makeSound 函数时,实际调用的是派生类的实现,从而实现了多态。

标签:makeSound,函数,含义,派生类,多态,c++,Animal,基类
From: https://blog.csdn.net/weixin_73861555/article/details/143622012

相关文章

  • 最新毕设-SpringBoot-求职推荐系统-55000(免费领项目)可做计算机毕业设计JAVA、PHP、爬
    摘 要当前社会竞争激烈,求职市场信息众多,但信息不对称、筛选困难的问题依然存在。因此,设计开发一款求职推荐系统是顺应时代发展的必然选择。该求职推荐系统利用Java编程语言,使用springboot技术框架,采取MySQL数据库实现系统的各项功能,具有便捷高效、安全友好的特点,促进求职招聘......
  • C++:模拟实现STL的list
    目录一.list类1.list的创建节点2.list迭代器的运算符操作3.list的构造函数及析构4.list的迭代器5.list的插入及删除二.整体代码1.list.h2.list.cpp在上一节已经了解list在库中的用法,在这里实现list的底层逻辑一.list类1.list的创建节点template<classT>struc......
  • C++入门基础(一)
    目录C++关键字命名空间命名冲突例子域的概念理解命名空间定义例子1例子2例子3例子4例子5例子6例子7C++输出与输入输出输入感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接......
  • C++解倒三角问题
    题目描述输入一个整数打印数字图形。输入一个整数(0<n<10)输出一个数字图形样例输入 3样例输出 关于本题代码如下:#include<iostream>usingnamespacestd;intmain(){ intn,k,t=1; cin>>n;k=n; for(inti=1;i<=n;i++......
  • c++解修剪花圃问题
    C++解“修剪花圃”题目描述你知道吗?在外国,如果你不修剪你的花圃,是要被贴罚单的。Xman忙于战斗,被贴了好多罚单。这一次好不容易休息了,他决定修剪一下。修剪成什么样子呢?当然是X形。Xman的花圃是一个n*n的正方形,其中n为大于等于3的正奇数。在每个位置上都有几个植物,对应的......
  • C++总结
    目录一、面向对象的三大特性二、引用2.1概念2.2特性三、类与对象3.1概念3.2类的内容3.3对象的创建四、构造函数与析构函数五、封装六、继承6.1概念与基础使用6.2继承权限6.2.1权限修饰符6.2.2继承权限6.3构造函数6.3.1派生类与基类的构造函数关系6.3......
  • Java入门14——动态绑定(含多态)
    大家好,我们今天来学动态绑定和多态,话不多说,开始正题~但是要学动态绑定之前,我们要学习一下向上转型,方便后续更好地理解~一、向上转型1.什么是向上转型网上概念有很多,但其实通俗来讲,向上转型就是把一个子类转换成父类2.代码演示+讲解这次我们依然以动物为例做演示~首先我......
  • 【C++11】智能指针
    一.为什么需要智能指针        学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭喊着指针不好用,那么今天要介绍的智能指针可以释放大家在使用裸指针时的一些压......
  • 【C++】C++11之函数对象,Lambda表达式和functional函数对象类型
    知识的学习在于点滴记录,坚持不懈函数对象        重载了函数调用运算符()的类的对象,即为函数对象。        std::function由上文可以看出:由于可调用对象的定义方式比较多,但是函数的调用方式较为类似,因此需要使用一个统一的方式保存可调用对象或者传递可......
  • C++循环引用指的是什么,在使用过程当中需要注意什么问题
    C++中的循环引用是指两个或多个对象相互持有对方的引用,导致这些对象无法被自动释放,从而造成内存泄漏。循环引用主要发生在使用智能指针(如 std::shared_ptr)管理对象生命周期时。以下是循环引用的具体解释及其使用中需要注意的问题:循环引用的形成当两个对象A和B互相持......