C++多态小结
示例#
class test1
{
public:
virtual void proc1();
void proc();
};
class test2:public test1
{
public:
virtual void proc1();
};
void test1::proc1()
{
cout<<"1";
}
void test1::proc()
{
proc1();
}
void test2::proc1()
{
cout<<"2";
}
定义了test1和test2两个类,其中test2为test1的子类。其中两个类中都有虚函数Proc1,子类test1还有个成员函数Proc,此成员函数会调用虚函数Proc1。
test2 A;
A.proc();
实例化一个test2类对象,然后调用test1的成员函数proc。由于c++多态的作用实际proc函数调用的是test2的Proc1。因为其是通过虚拟指针查表得到的proc1函数的地址,所以是多态。
误解#
误认为只有通过指针和引用调用虚函数时才会形成多态,实际这句话是相对于通过类对象实例直接调用虚函数而言的。
test2 A;
A.Proc1();
//上述代码是通过类实例直接调用虚函数,所以编译器直接编译为直接调用的形式
test2* p;
p->Proc1();
//上述代码是通过指针调用的虚函数,所以编译器将其编译为通过虚表指针查表得方式得到函数地址,然后再调用。
实际除了通过类对象实例直接调用虚函数之外(再构造/析构函数/成员函数中调用虚函数也不会形成多态),其他形式调用虚函数都会形成多态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】