首页 > 编程语言 >C++多态详解:静态多态与动态多态的实现

C++多态详解:静态多态与动态多态的实现

时间:2024-06-10 12:02:14浏览次数:18  
标签:调用 函数 show 多态 C++ 详解 Print public

C++中的多态是面向对象编程的重要特性,允许相同的接口调用不同的实现。多态性可以分为两类:静态多态和动态多态。

1. 静态多态 (编译时多态)

(1)函数重载 (Function Overloading)
函数重载是一种静态多态,允许同一个函数名在同一作用域内具有不同的参数列表。这些不同的版本在编译时根据参数类型和数量区分。

#include<iostream>
using namespace std;

class Print {
public:
    void show(int x) {
        cout << "Integer: " << x << endl;
    }

    void show(double x) {
        cout << "Double: " << x << endl;
    }

    void show(string x) {
        cout << "String: " << x << endl;
    }
};

int main() {
    Print print;
    print.show(10);       // 调用第一个show (int)
    print.show(3.14);     // 调用第二个show (double)
    print.show("Hello");  // 调用第三个show (string)
    return 0;
}

(2)模板(Templates)
模板允许编写通用代码,即代码中可以使用不特定数据类型。这种特性也属于静态多态,因为生成具体版本的代码是在编译时进行的。

#include<iostream>
using namespace std;

template <typename T>
class Print {
public:
    void show(T x) {
        cout << "Value: " << x << endl;
    }
};

int main() {
    Print<int> printInt;
    Print<double> printDouble;
    Print<string> printString;

    printInt.show(10);        // 生成并调用Print<int>::show(int)
    printDouble.show(3.14);   // 生成并调用Print<double>::show(double)
    printString.show("Hello");  // 生成并调用Print<string>::show(string)

    return 0;
}

2. 动态多态 (运行时多态)

(1)函数覆盖(Function Overriding)
函数覆盖是指在派生类中重新定义基类中已经存在的虚函数。动态多态是通过虚函数和虚函数表(vtable)机制实现的。

#include<iostream>
using namespace std;

class Base {
public:
    virtual void show() {
        cout << "Base class" << endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        cout << "Derived class" << endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;
    basePtr = &derivedObj;

    basePtr->show();  // 调用Derived::show,通过动态绑定实现
    return 0;
}
虚函数的实现原理

当一个类包含虚函数时,编译器为该类创立虚函数表(vtable),表中存放该类虚函数的指针。类的每个对象保存一个指向其虚函数表的虚指针(vptr)。通过该虚指针,可以在运行时动态地调用正确的函数实现。

(2)纯虚函数(Pure Virtual Function)
纯虚函数没有函数体,需要在基类中声明,并在派生类中实现。含有纯虚函数的类称为抽象类,不能被实例化。

#include<iostream>
using namespace std;

class Base {
public:
    virtual void show() = 0;  // 纯虚函数
};

class Derived : public Base {
public:
    void show() override {
        cout << "Derived class implementing pure virtual function" << endl;
    }
};

int main() {
    Derived derivedObj;
    Base* basePtr = &derivedObj;

    basePtr->show();  // 调用Derived::show
    return 0;
}
总结
  • 静态多态(重载和模板):在编译时确定调用的函数,通过参数类型和数量(重载)或模板实例化来实现。
  • 动态多态(覆盖和虚函数):在运行时动态决定调用的函数,通过虚函数和虚函数表实现。虚函数可以在派生类中覆盖,纯虚函数强制派生类实现。

以上的概念为C++编程中的多态提供了灵活而强大的功能,允许同一接口在不同上下文中表现出不同的行为。

标签:调用,函数,show,多态,C++,详解,Print,public
From: https://blog.csdn.net/m0_72877724/article/details/139560027

相关文章

  • 深入理解 C++ 动态内存管理:new vs malloc
    概述new/delete 是C++的关键字,需要编译器支持。malloc/free 是库函数,需要头文件支持。使用 new 申请内存分配时无需指定内存块大小,编译器会自动计算。而 malloc 需要明确指定所需内存的大小。new 会返回对象类型的指针,类型安全。而 malloc 返回 void*,需要进行强制......
  • MySQL数据库---LIMIT、EXPLAIN详解
    分页查询语法select_column,_columnfrom_table[whereClause][limitN][offsetM]select*:返回所有记录limitN:返回N条记录offsetM:跳过M条记录,默认M=0,单独使用似乎不起作用limitN,M:相当于limitMoffsetN,从第N条记录开始,返回M......
  • Android RecyclerView使用详解(含通过网络请求得到数据)
    RecyclerView概述RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。对于RecyclerView的使用根据实际项目进行说明,一些功能可......
  • Python中的异常处理详解
    异常处理是编程中常见的一项任务,用于处理程序在运行时可能发生的错误情况。Python提供了强大的异常处理机制,使得开发者能够更好地控制和处理程序的异常情况。本文将深入探讨Python中的异常处理,包括异常的基本概念、异常处理语句、异常类型以及如何自定义异常。目录异常的......
  • 表达式求值--后缀 C++实现
    #include<iostream>#include<string>#include<stack>usingnamespacestd;intPostFixRun(stringch){stack<int>stk;for(inti=0;i<ch.size();i++){if(ch[i]>='0'&&ch[i]<='9')......
  • 线性表总结(数据结构C++,大二下写,初学者)
    这段时间,我学到了这门课的第一种数据结构——线性表。关于线性表的知识,我总结为三方面:课本上学到的知识、上机实现课本上的例子的过程所学到的知识和力扣做题学到的知识和技巧。顺序表线性表中第一个学到的是顺序表,为此我翻了一下课本。顺序表,顾名思义,是线性表的顺序存储结构......
  • C++实现一个简单的计算器
    使用C++创建一个简单的计算器,可以实现+,-,*,/。#include<iostream>usingnamespacestd;intmain(){charop;floatnum1,num2;cout<<"输入运算符:+、-、*、/:";cin>>op;cout<<"输入两个数:";cin&g......
  • C++学习步骤
    学习C++,你可以按照以下步骤进行:1.**基础概念**:  -了解C++的历史和特性。  -学习变量、数据类型(如int,float,char等)和基本运算符。2.**控制结构**:  -条件语句(if,else,switch)  -循环语句(for,while,do-while)3.**函数**:  -函数的定义和调用。......
  • 线程池代码详解
    线程池概念线程池是一种基于池化技术的多线程管理机制。在这种模式下,一组线程被创建并且维护在一个"池"中,这些线程可以被循环利用来执行多个任务。当有新的任务到来时,线程池会尝试使用已经存在的空闲线程,而不是每次都创建新线程。这样做的目的是为了减少因频繁创建和销毁线程所带......
  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第1题new,delete的指向深度拷
    C++PrimerPlus第12章类和动态内存分配12.10编程练习第1题`提示:练习一定要动手操作涉及标准函数及关键词1,new[],delete[],strlen(),strcpy_s(),cout,endl,explicit例如:1,对于下面的类的声明:`提示:设计数组和字符串的new,delete文章目录C++PrimerPlus第12章类......