美文网首页
C++——虚函数,纯虚函数,函数重载

C++——虚函数,纯虚函数,函数重载

作者: 赋闲 | 来源:发表于2017-02-20 11:21 被阅读0次

异质链表

虚函数
虚函数主要用于多态

若一个类中含有虚函数
则系统会自动的创建一个表,
该表用于存放虚函数的入口地址
称该表为虚函数表

该类会自动添加一个指针,
该指针存放虚函数表的首地址
称该指针为虚函数表指针

纯虚函数
实现多态,实现没有意义-->定义为纯虚函数
含有纯虚函数的类称之为抽象类
抽象类不能定义对象

若派生类中,没有对纯虚函数进行定义
则该派生类仍为抽象类,不能定义对象

如果想用派生类生成对象,
则在派生类中必须要对纯虚函数进行定义

若派生类中存在和基类虚函数函数原型相同的函数
则该派生类函数默认为虚函数

系统会自动的用该派生类函数的地址
覆盖掉虚函数表中和其函数原型相同的基类的虚函数的地址

指针能够访问的范围受类型局限
即只能访问该指针类型中的成员
通过基类的指针或者引用来调用函数时
若该函数为虚函数,则到虚函数表中查找其入口地址
获得地址后,转到该地址执行函数

若派生类中存在和基类同名的成员变量
优先使用派生类中的成员变量

静态联边和动态联边

静态联边的对象是在编译后确定(多态)
动态联边的对象是在运行时确定

在类中定义的普通函数默认为inline函数
(静态成员函数,虚函数,构造函数,析构函数,不能为inline函数)
inline定义的内联函数,函数代码被放入符号表中,
在使用时进行替换(像宏一样展开),效率很高。
类的内联函数也是函数。编绎器在调用一个内联函数,
首先会检查参数问题,保证调用正确,
像对待真正函数一样,消除了隐患及局限性。
inline可以作为类的成员函数,又可以使用所在类的保护成员及私有成员

#include <iostream>
#include <string>
using namespace std;

class Shape
{
public:
    //虚函数
    //虚函数主要用于多态

    //若一个类中含有虚函数
    //则系统会自动的创建一个表,
    //该表用于存放虚函数的入口地址
    //称该表为虚函数表

    //该类会自动添加一个指针,
    //该指针存放虚函数表的首地址
    //称该指针为虚函数表指针
    virtual float getArea()
    //float getArea()
    {
        return 0;
    }
};

class Rectangle: public Shape
{
public:
    Rectangle(float w = 0, float h = 0)
    {
        m_fWidth = w;
        m_fHeight = h;
    }
    //若派生类中存在和基类虚函数函数原型相同的函数
    //则该派生类函数默认为虚函数
    
    //系统会自动的用该派生类函数的地址
    //覆盖掉虚函数表中和其函数原型相同的基类的虚函数的地址
    float getArea()
    {
        return m_fWidth * m_fHeight;
    }
    //类中定义的普通函数默认为inline函数
    //静态成员函数,虚函数,构造函数,析构函数不能为inline
    //inline void test() 
    void test() 
    {}
private:
    float m_fWidth;
    float m_fHeight;
};

class Triangle: public Shape
{
public:
    Triangle(float b = 0, float h = 0)
    {
        m_fBottom = b;
        m_fHeight = h;
    }
    float getArea()
    {
        return m_fBottom * m_fHeight / 2;
    }
private:
    float m_fBottom;
    float m_fHeight;
};
#if 1
//指针能够访问的范围受类型局限
//即只能访问该指针类型中的成员
void fun(Shape *pShape)
{
    //通过基类的指针或者引用来调用函数时
    //若该函数为虚函数,则到虚函数表中查找其入口地址
    //获得地址后,转到该地址执行函数
    cout << pShape->getArea() << endl;
//  pShape->test();  //error
}
#endif

int main(void)
{
    cout << sizeof(Shape) << endl;
    Rectangle rec(3,4);
//  cout << rec.getArea() << endl;
    fun(&rec);  
    Triangle tri(3,4);
//  cout << tri.getArea() << endl;
    fun(&tri);
    Shape sh;
//  cout << sh.getArea() << endl;
    fun(&sh);
    return 0;
}
#include <iostream>
#include <string>
using namespace std;

class Shape
{
public:
    //纯虚函数
    //实现多态,实现没有意义--》定义为纯虚函数
    //含有纯虚函数的类称之为抽象类
    //抽象类不能定义对象

    //若派生类中,没有对纯虚函数进行定义
    //则该派生类仍然为抽象类,不能定义对象

    //如果想用派生类生成对象,
    //则在派生类中必须对纯虚函数进行定义
    virtual float getArea() = 0;
};

class Rectangle: public Shape
{
public:
    Rectangle(float w = 0, float h = 0)
    {
        m_fWidth = w;
        m_fHeight = h;
    }
    float getArea()
    {
        return m_fWidth * m_fHeight;
    }
private:
    float m_fWidth;
    float m_fHeight;
};

class Triangle: public Shape
{
public:
    Triangle(float b = 0, float h = 0)
    {
        m_fBottom = b;
        m_fHeight = h;
    }
    float getArea()
    {
        return m_fBottom * m_fHeight / 2;
    }
private:
    float m_fBottom;
    float m_fHeight;
};
void fun(Shape *pShape)
{
    cout << pShape->getArea() << endl;
}

int main(void)
{
    Rectangle rec(3,4);
    fun(&rec);  
    
    Triangle tri(3,4);
    fun(&tri);
    
    return 0;
}
#include <iostream>
#include <string>
using namespace std;

class Complex
{
public:
    Complex(int real = 0, int vir = 0)
    {
        m_iReal = real;
        m_iVir = vir;
    }
    void show()
    {
        cout << m_iReal << '+' << m_iVir << 'i' << endl;
    }
    friend Complex operator+(const Complex &c1
                             , const Complex &c2);
    friend Complex operator-(const Complex &c1
                             , const Complex &c2);
    friend bool operator>(const Complex &c1
                          , const Complex &c2);
private:
    int m_iReal;
    int m_iVir;
};

//返回值类型:Complex
//函数名:operator+
//形参列表:const Complex &c1, const Complex &c2
Complex operator+(const Complex &c1, const Complex &c2)
{
    Complex com;
    com.m_iReal = c1.m_iReal + c2.m_iReal;
    com.m_iVir = c1.m_iVir + c2.m_iVir;
    return com;
}
Complex operator-(const Complex &c1, const Complex &c2)
{
    Complex com;
    com.m_iReal = c1.m_iReal - c2.m_iReal;
    com.m_iVir = c1.m_iVir - c2.m_iVir;
    return com;
}

bool operator>(const Complex &c1, const Complex &c2)
{
    if (c1.m_iReal > c2.m_iReal 
        || ((c1.m_iReal == c2.m_iReal)
             &&(c1.m_iVir > c2.m_iVir)))
    {
        return true;
    }
    return false;
}

int main(void)
{
    Complex com(3, 4);
    com.show();

    Complex com2(4, 9);
    com2.show();

    //Complex com3 = com + com2;
    Complex com3 = operator+(com, com2);
    com3.show();
    
    //Complex com4 = com - com2;
    Complex com4 = operator-(com, com2);
    com4.show();

    if (com3 > com4)
    {
        cout << "com3 > com4" << endl;
    }
    else
    {
        cout << "com3 <= com4" << endl;
    }

    return 0;
}

相关文章

  • 查漏补缺

    C++虚函数: 多态: 静态多态(重载)、动态多态(虚函数) 虚函数 虚函数表:编译器为每个类创建了一个虚函数表...

  • C++——虚函数,纯虚函数,函数重载

    异质链表 虚函数虚函数主要用于多态 若一个类中含有虚函数则系统会自动的创建一个表,该表用于存放虚函数的入口地址称该...

  • C++学习笔记

    C++面对对象 实函数,虚函数,纯虚函数,函数重写 虚函数:需要进行子类的重写时。virtual void 函数名...

  • C++语言-多态,纯虚函数,模版函数

    1、虚函数、纯虚函数 需要注意的是,纯虚函数子类是必须继承的,虚函数不是不必须继承的。 2、多态 在C++中默认关...

  • 慕课网-C++远征之多态篇(中)-学习笔记

    c++远征之多态篇 纯虚函数 & 抽象类 例子: 纯虚函数: 没有函数体 直接等于0 在虚函数表中直接写为0, 包...

  • C++之虚函数、纯虚函数和C#虚函数、抽象函数

    参考:有空 整理 1虚函数纯虚函数C++由virtual声明virtual <类型><函数名>(<参数表>)=...

  • C++面向对象

    小结 虚函数是virtual声明的。实现动态链接的功能。 纯虚函数是没有函数主体的虚函数。 一、C++继承 1.当...

  • 纯虚函数和抽象类

    纯虚函数和抽象类 概念 纯虚函数:没有函数体的虚函数。 抽象类:包含纯虚函数的类就称为抽象类。 纯虚函数就是在函数...

  • C++多态——虚函数表vtable

    纯Swift类的函数调用原理,类似于C++的虚函数表 纯Swift类的函数调用,类似于C++的虚函数表,是编译时决...

  • 4.0 C++远征:纯虚函数与抽象类

    3-1纯虚函数抽象类 [TOC] 一、纯虚函数 1.纯虚函数的定义 ​ 纯虚函数,没有函数体,同时定义时在函数...

网友评论

      本文标题:C++——虚函数,纯虚函数,函数重载

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