在刚开始接触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版权协议,转载请附上原文出处链接和本声明。