美文网首页
C++ 多态的实现和原理

C++ 多态的实现和原理

作者: 石器时代小古董 | 来源:发表于2019-04-23 23:36 被阅读0次

多态的实现
虚函数原理

一、在编译期间实现多态

多态是指在不同的条件下表现出不同的状态,C++中通过重载函数的方法可以在编译期间实现多态。

在编译时编译器会根据参数列表的不同寻找合适的函数。

int Add(int left, int right)
{
    return left + right;
}
double Add(double left, int right)
{
    return left + right;
}

int main()
{
    Add(10, 20);
    Add(10.0,20);  //正常代码
    return 0;
}
二、使用虚函数实现多态

C++中运行时多态可以通过声明一个虚函数来实现。虚函数分为纯虚方法和半虚方法,纯函数父类没有实现版本,完全交给子类,且必须实现。半虚函数父类可以实现,子类需要重写,他们都由关键字virtual修饰。

运行时多态的条件:
● 必须是集成关系
●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。
●通过基类对象的指针或者引用调用虚函数。

重写虚函数时一定要保证函数的返回值,参数列表,函数名称完全一致

// 半虚函数 父类实现,但希望子类重写
virtual void withDraw(){
    a=10;
};
// 纯虚函数
virtual void onDraw()=0;
virtual ~Clazz();

使用虚函数实现多态示例

#ifndef student_hpp
#define student_hpp

#include <stdio.h>
#include <string>
using namespace std;
class Student{
private:
    int mAge;
    string mName;
protected:
    int mClazz;
public:
    Student() {};
    void setName(const string &age);
    string getName() const;
    void setAage(int &age);
    int getAge() const;
    virtual void setClassMate(int num){
        mClazz=num;
        std::cout<<“call parent method”<<std::endl;
    };
    virtual int getClassMate(){
        return mClazz;
    };
    virtual ~Student() {}
};

class Guo:public Student{
public:
    Guo() {};
    virtual void setClassMate(int num){
        mClazz = num;
        std::cout<<“call child method”<<std::endl;
    };
    virtual int getClassMate(){
        return mClazz;
    };
    virtual ~Guo();
};
void setClass(Student &st,int clazz){
  st.setClassMate(clazz);
}
int main(){
   Student student;
   Guo guo;
   setCLass(student);
   setClass(guo)
}

以下函数不能作为虚函数
1)友元函数,它不是类的成员函数
2)全局函数
3)静态成员函数,它没有this指针
3)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数)

三、虚函数的实现原理

一个类中如果有虚函数声明,那么这些函数会由一个虚函数表来维护
1) 每个父类都有自己的虚表。

2) 子类的成员函数被放到了第一个父类的表中。

3) 内存布局中,其父类布局依次按声明顺序排列。

4) 每个父类的虚表中的函数都被overwrite成了子类函数。这样做就是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数。

相关文章

  • 深刻剖析之c++博客文章

    三大特性 封装、继承、多态 多态 C++ 虚函数表解析C++多态的实现原理 介绍了类的多态(虚函数和动态/迟绑定)...

  • 多态的C++实现

    多态的C++实现 1 多态的原理 什么是多态?多态是面向对象的特性之一,只用父类指针指向子类的对象。 1.1 多态...

  • 聊聊Java的泛型及实现

    摘要: 和C++以模板来实现静多态不同,Java基于运行时支持选择了泛型,两者的实现原理大相庭径。C++可以支持基...

  • C++ 多态的实现和原理

    多态的实现虚函数原理 一、在编译期间实现多态 多态是指在不同的条件下表现出不同的状态,C++中通过重载函数的方法可...

  • Swift5.1学习随笔之多态

    多态的实现原理: OC:Runtime C++:虚表(虚函数表) Swift:纯Swift没有Runtime,更加...

  • Cpp7 C++的多态实现 -- 虚表

    Cpp7 C++的多态实现 -- 虚表 多态的实现原理 总结:1. 当我们在类中定义虚函数时,就会产生虚表2. 多...

  • C++多态实现和virtual原理

    本文转载自:(做了一些改动)http://www.cnblogs.com/feixiang927/p/504856...

  • C++ - 多态实现原理

    多态的实现举例 看一下例子程序 输出结果:8,12比正常输出多出了4个字节。 多态实现原理 每一个有虚函数的类(或...

  • Java基础之面向对象

    1.多态,继承,封装 Java实现多态有哪些必要条件?具体怎么实现?多态的实现原理?多态的作用? 答:多态的优点 ...

  • 建议27:明晓类公共领域的方法都是虚方法

    众所周知,在C++,C# 等面向对象开发语言中,虚方法(函数)是实现“多态”的基础,其实现原理:运行系统将根据对象...

网友评论

      本文标题:C++ 多态的实现和原理

      本文链接:https://www.haomeiwen.com/subject/yckigqtx.html