C++ 虚函数的简单理解

  在刚开始接触C++的虚函数时,有一些疑惑。为什么有这个的存在,因为在C++中已经有一个规定就是——子类可以遮蔽父类的同名函数。那么为什么还要存在虚函数。

我们可以先假设一下不存在虚函数,那么进行下面一个定义。定义两个通讯口,一个是TCP通信,一个是UART通信。那么可以定义两个类继承Communication;

 

class Communication
{
public:
    Communication() {};
    ~Communication() {};

    void Send() { std::cout << "father send" << std::endl; };
};

class Uart :public Communication
{
public :
    Uart() {};
    ~Uart() {};

    void Send() { std::cout << "uart send" << std::endl; };
};

class Tcp :public Communication
{
public:
    Tcp() {};
    ~Tcp() {};

    void Send() { std::cout << "tcp send" << std::endl; };
};

int main()
{
    Uart* uart = new Uart();
    Tcp* tcp = new Tcp();

    uart->Send();
    tcp->Send();
}

那么输出的结果就是:

uart send
tcp send

 

这里看好像没什么问题。但是这里为了指向不同的子类,定义了两个不同的子类对象。那么如何通过一个对象来输出不同子类的内容呢?那么这时候就用到了虚函数。如果变换为下面的定义

class Communication
{
public:
    Communication() {};
    ~Communication() {};

    virtual void Send() { std::cout << "father send" << std::endl; };
};

class Uart :public Communication
{
public :
    Uart() {};
    ~Uart() {};

    virtual void Send() { std::cout << "uart send" << std::endl; };
};

class Tcp :public Communication
{
public:
    Tcp() {};
    ~Tcp() {};

    virtual void Send() { std::cout << "tcp send" << std::endl; };
};

int main()
{
    Communication* com = new Uart();
    com->Send();
    delete com;
    com = new Tcp();
    com->Send();
    delete com;
}

请看:在main函数中 只定义了一个父类指针com下面就没有定义其他的指针了,通过指向不同的子类对象来实现不同的功能。那么这里就可以看成一个动态的变化过程,只定义了一个父类指针,但是再程序执行的过程中使用不同的对象。而不适用虚函数,那么定义的时候就已经确定了,就不能动态的选用。

所以可以说:

1、用父类指针调用虚函数时,执行的是动态绑定的Send函数。只有在运行到才知道调用哪一个。

2、如果不用父类指针,只是简单的定义对象(非指针类型),那么虚函数就没有意义了。

3、多态性就是针对虚函数而言的,非虚函数不存在多态的说话。

 

这里就是一些小小的理解。

 


版权声明:本文为qq_32497777原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。