首页 > 编程语言 >C++系列十:日常学习-非多态类型和多态类型

C++系列十:日常学习-非多态类型和多态类型

时间:2023-09-05 09:12:23浏览次数:58  
标签:函数 C++ 多态 printValue Base value 类型

目录

介绍:

  1. 非多态类型和多态类型是C++中的两种类型,它们的主要区别在于是否包含虚函数和是否能进行动态绑定。
  2. 非多态类型是指没有虚函数的类型。这种类型在编译时进行类型检查,因此不能在运行时改变其静态类型。对于非多态类型,编译器在编译时就已经确定了其所有信息,包括成员变量、成员函数等,因此不能在运行时动态地改变这些信息。
  3. 多态类型则相反,它包含虚函数,可以在运行时改变其静态类型。多态类型在编译时只确定一部分信息,例如成员变量、成员函数等,而另一部分信息则在运行时通过动态绑定确定。因此,多态类型可以在运行时动态地改变其行为,例如通过覆盖虚函数实现不同的功能。
  4. 需要注意的是,非多态类型和多态类型并不是一种严格的分类方式,而是一种相对的概念。一种类型可能是非多态的,但在继承和覆盖的情况下可能会变成多态的。同样,一种类型可能是多态的,但在没有虚函数的情况下也可能变成非多态的。

案例:

非多态类型示例:
#include <iostream>  
  
class NonPolymorphic {  
public:  
    int value;  
  
    NonPolymorphic(int value) : value(value) {}  
  
    void printValue() const {  
        std::cout << "The value is: " << value << std::endl;  
    }  
};  
  
int main() {  
    NonPolymorphic np1(10);  
    NonPolymorphic np2(20);  
  
    np1.printValue();  // Output: The value is: 10  
    np2.printValue();  // Output: The value is: 20  
  
    return 0;  
}

在这个例子中,NonPolymorphic类是一个非多态类型,它有一个方法printValue(),无论通过哪个对象调用这个方法,都会产生同样的结果。因此,非多态类型的行为在编译时就已经确定。



多态类型示例:
#include <iostream>  
  
class Base {  
public:  
    virtual void printValue() const {  
        std::cout << "The value in Base is: 10" << std::endl;  
    }  
};  
  
class Derived : public Base {  
public:  
    void printValue() const override {  
        std::cout << "The value in Derived is: 20" << std::endl;  
    }  
};  
  
int main() {  
    Base* b1 = new Derived; // 向上转型,将Derived的对象转型为Base  
    Base* b2 = new Base; // 同上  
  
    b1->printValue(); // Output: The value in Derived is: 20,因为b1指向的对象是Derived类型,所以调用的是Derived的printValue方法。  
    b2->printValue(); // Output: The value in Base is: 10,因为b2指向的对象是Base类型,所以调用的是Base的printValue方法。  
  
    delete b1;  
    delete b2;  
  
    return 0;  
}

在这个例子中,Base类是一个多态类型,它有一个虚函数printValue()。通过基类指针调用这个方法时,会根据实际指向的对象类型来决定执行哪个版本的实现。因此,同样的方法调用会产生不同的结果。这就是多态的表现。

标签:函数,C++,多态,printValue,Base,value,类型
From: https://www.cnblogs.com/zhouyitty/p/17678768.html

相关文章

  • 《C++》11新特性--多线程
    thread创建线程,不会阻塞主线程thread成员函数voidthread::join();阻塞线程,当前线程执行完毕才会往下执行boolthread::joinble();线程是否可以连接,返回voidthread::detach();分离主线程和子线程的关联voidprintI(){for(size_ti=0;i<100;i++){std::c......
  • C++将派生类赋值给基类
    在C/C++中经常会发生数据类型的转换,例如将int类型的数据赋值给float类型的变量时,编译器会先把int类型的数据转换为float类型再赋值;反过来,float类型的数据在经过类型转换后也可以赋值给int类型的变量。数据类型转换的前提是,编译器知道如何对数据进行取舍。例如:inta=......
  • 二、c++容器学习vector
    1、Vector介绍1.1vector基本概念vector与普通数组区别:不同区别是数组是静态空间,而vector可以是动态扩展。动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原始数据拷贝新空间,释放原空间。vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构......
  • [C++] std::optional与RVO:最高效的std::optional实践与探究
    返回值优化RVO在cppreference中,是这么介绍RVO的Inareturnstatement,whentheoperandisthenameofanon-volatileobjectwithautomaticstorageduration,whichisn'tafunctionparameteroracatchclauseparameter,andwhichisofthesameclasstype(igno......
  • 线程池至少需要线程数——23秋招招行网络科技第一批技术测评_后端(c++)
    题目:有n个计划,每个计划有开始,结束时间,求线程池最少需要多少个线程?例:输入:2,[[1,2],[3,4]],输出:1输入:2, [[1,3],[2,4]],输出:2 思路:贪心算法PS:其实我不是很理解下面代码第11行,分别对a,b数组排序1#include<bits/stdc++.h>2usingnamespacestd;34intma......
  • 解释C++中类的不同成员类型和成员列表的含义--GPT
    C++定义的class的PublicMemberFunctions|StaticPublicMemberFunctions|PublicAttributes|StaticPublicAttributes|StaticProtectedAttributes|Listofallmembers都是什么意思?GPT:在C++中,一个类(class)可以定义多种类型的成员,这些成员包括函数(成员函数)和变......
  • C++语言学习08
    一、智能指针常规指针的缺点:当一个常规指针离开了作用域时,只有该指针变量本身占用的内存空间(4/8字节)会被释放,而它指向的内存空间不会自动释放,当free\delete\delete[]语句忘记执行或者无法执行,形成内存泄露(如何定位哦内存泄露、如何预防内存泄露)智能指针的优点:智能指......
  • C++11——3.21-3.22 move,forward
    ★★★原文链接★★★:https://subingwen.cn/cpp/move-forward/3.21move资源的转移3.22forward完美转发3.21move资源的转移move方法可以将左值转换为右值使用这个函数并不能移动任何东西,它将一个对象的所有权从这个对象转移到另一个对象,只是转移,没有内存拷贝。move语......
  • QT枚举类型的使用
    QT枚举类型的使用测试将这个枚举放在头文件外面,Q_ENUM也不可以引用,这个限制有点奇葩,引用另一个头文件定义的枚举类型也不行.h头文件enumTetrixShape{NoShape,ZShape,SShape,LineShape,TShape,SquareShape,LShape,MirroredLShape};Q_ENUM(......
  • MySQL的Json类型个人用法详解
    前言虽然MySQL很早就添加了Json类型,但是在业务开发过程中还是很少设计带这种类型的表。少不代表没有,当真正要对Json类型进行特定查询,修改,插入和优化等操作时,却感觉一下子想不起那些函数怎么使用。比如把json里的某个键和值作为SQL条件,修改某个键下的子键的值,其中可能会遇到数组形式......