C++中虚函数的作用
程序员文章站
2024-02-26 21:53:16
...
我最近刚刚开始学习C++,一直对虚函数有些困惑,不知道它有什么用处,于是写了段代码测试了一下,发现它在面向对象编程中主要有两个用处。
1.实现多态
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
virtual void vfunc1()
{
cout << "A's vfunc1" << endl;
}
void func1()
{
cout << "A's func1" << endl;
}
};
class B:public A
{
public:
virtual void vfunc1()
{
cout << "B's vfunc1" << endl;
}
void func1()
{
cout << "B's func1" << endl;
}
};
class C :public B
{
public:
virtual void vfunc1()
{
cout << "C's vfunc1" << endl;
}
void func1()
{
cout << "C's func1" << endl;
}
};
int main()
{
A a; B b; C c;
vector<A*> foo;
foo.push_back(&a);
foo.push_back(&b);
foo.push_back(&c);
cout << "虚函数的调用情况" << endl;
for (auto i:foo)
{
i->vfunc1();
}
cout << "非虚函数的调用情况" << endl;
for (auto i : foo)
{
i->func1();
}
return 0;
}
因为容器中的每个元素的字节数应该是相同的,所以我指定其存放的格式为指向父类A的指针,占用4个字节,运行代码得到以下结果:
说明调用函数时,虚函数会被子类覆盖,实现动态绑定;而非虚函数仍为A的fun1(),这是静态绑定
2.方便客户进行二次开发
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
class company
{
public:
virtual void serialize()=0;
void func()
{
cout << "general part I" << endl;
serialize();
cout << "general part II" << endl;
}
};
class client:public company
{
virtual void serialize()
{
cout << "special part" << endl;
}
};
int main()
{
client A;
A.func();
return 0;
}
可以看到,一些公司提供的代码只编写了通用的部分,而特定的部分需要客户自己实现,因此把特定部分设置为虚函数,留给客户进行二次开发,结果如下:
推荐阅读
-
听如子说:Python中datetime模块中strftime/strptime函数的使用
-
C++中虚函数的作用
-
Linux中编译带clock_gettime函数的代码,提示undefined reference to 'clock_gettime'
-
并行算法的性能度量——函数句柄在并行程序分析中的应用(2-4)
-
浅述python中argsort()函数的实例用法
-
MySQL存储过程中的基本函数和触发器的相关学习教程
-
浅谈function(函数)中的动态参数
-
C++基础知识(五) C++中union结构,union和struct的区别
-
C#中静态构造函数的几点说明介绍
-
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析