虚函数与多态
(很基础,本人菜鸟,大师勿喷,不过欢迎指正错误或补充)
不解释,先上例子:
class A
{
public:
virtual void print ()=0;
virtual void v_cname() { cout << "class A print by v_cname" << endl;}
void cname() { cout << "class A print by cname" << endl;}
};
class B : public A
{
public:
void print (){ cout << "class B , print " << endl;}
void v_cname() { cout << "class B , v_cname" << endl;}
void cname() { cout << "class B , cname" << endl;}
};
class C : public A
{
public:
void print (){ cout << "class C , print " << endl;}
void v_cname() { cout << "class C , v_cname" << endl;}
void cname() { cout << "class C , cname" << endl;}
};
在main函数中执行:
cout << "class B" << endl;
A * a = new B();
a->v_cname ();
a->print();
a->cname ();
a = new C();
cout << "class C" << endl;
a->v_cname ();
a->print();
a->cname ();
程序输出:
class B
class B , v_cname
class B , print
class A print by cname
class C
class C ,v_cname
class C , print
class A print by cname
简单一句话:基类的指针指向派生类,若基类中有虚函数(包括纯虚和非纯虚函数),则调用所指向的派生类对应的函数。
作用:一个基类指针指向不同的派生类时,可以调用不同派生类里面的函数(只要给函数在基类里面定义为虚函数)。(这就是传说中的“多态”???)
这里又可以分两种情况:
如果该函数是纯虚函数,那么必须在派生类中实现,调用的肯定是派生类里面的函数。
如果该函数不是纯虚函数,那么派生类里面可以重新实现该函数,也可以不实现该函数。这时,则先去派生类中找是否有该函数的实现,有则调用,如果没有,则调用基类的函数。
如上例中的类C定义改为:
class C : public A
{
public:
void print (){ cout << "class C , print " << endl;}
//void v_cname() { cout << "class C , v_cname" << endl;}
void cname() { cout << "class C , cname" << endl;}
};
同样执行main函数的代码,输出为:
class B
class B , v_cname
class B , print
class A print by cname
class C
class A print by v_cname
class C , print
class A print by cname
说明:派生类C中v_cname函数没有实现,所以调用了基类A中的v_cname函数。
关于虚函数:http://www.cnblogs.com/2007winter/archive/2012/04/19/2457190.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗