C++入门——多态

发布时间:2026/10/10 1:41:03
C++入门——多态 目录多态的概念多态的定义以及实现多态的构成条件虚函数虚函数的重写/覆盖虚函数重写的一些其他问题协变析构函数的重写override和final关键字纯虚函数和抽象类多态的概念多态通俗来说就是多种形态。多态分为编译时多态静态多态和运行时多态动态多态。静态多态就是我们之前讲的函数重载和函数模版传不同类型的参数就可以调用不同的函数通过参数不同达到多种形态。之所以叫做编译时多态是因为他们实参传给形参的参数匹配是在编译时完成的。动态多态就是去完成某个行为可以传不同的对象就会完成不同的行为。例如都是买票普通人买票就是全价买票学生买票就是打折。多态的定义以及实现多态的构成条件多态是一个继承关系下的类对象去调用同一函数产生了不同的行为。实现多态还必须有两个重要条件必须是基类的指针或者引用调用虚函数。因为只有基类的指针或者引用才能既指向基类对象又指向派生类对象。被调用的函数必须是虚函数并且完成了虚函数重写/覆盖。只有完成虚函数的重写/覆盖基类和派生类之间才能有不同的函数多态的不同类型效果才能达到。#includeiostream using namespace std; class person { public: virtual void buytic() { cout全价endl; } }; class student:public person { public: virtual void buytic() { cout打折endl; } }; void func(person p) { p.buytic(); } int main() { person p; student s; func(p); func(s); return 0; }虚函数类成员函数前面加virtual修饰那么这个成员函数被称为虚函数。注意非成员函数不能加virtual修饰。class person { public: virtual void buytic() { cout全价endl; } };虚函数的重写/覆盖虚函数的重写/覆盖派生类中有一个跟基类完全相同的虚函数。要求三同即返回值类型函数名字参数列表相同。如果派生类不重写基类的虚函数则会直接继承并使用基类的虚函数实现。重写可以被当做函数内容的重写注意在重写虚函数时派生类的虚函数不加virtual关键字时也可以构成重写但这种写法不是很规范不建议用。猜猜下面的代码输出的结果是什么class A { public: virtual void func(int val 1){ std::coutA- val std::endl;} virtual void test(){ func();} }; class B : public A { public: void func(int val 0){ std::coutB- val std::endl; } }; int main(int argc ,char* argv[]) { A *p new B; p-test(); return 0; }结果是是不是很惊讶原因是注这里是A *p new B虚函数重写的一些其他问题协变派生类重写基类虚函数时与基类虚函数返回值不同。即基类虚函数返回基类对象的指针或者引用派生类虚函数返回派生类对象的引用或者指针时成为协变。class person { public: virtual person* buytic() { cout 全价 endl; return nullptr; } void func() { buytic(); } }; class student :public person { public: virtual student* buytic() { cout 打折 endl; return nullptr; } }; int main() { person p; student s; p.func(); s.func(); return 0; }析构函数的重写基类的析构函数为虚函数此时派生类虚构函数只要定义无论是否加virtual关键字都与基类的析构函数构成重写。虽然基类和派生类的析构函数名字不一样看起来不符合重写的规则实际上编译器对析构函数的名称做了特殊处理都统一处理成了~destructor。知识回顾delete的原理1.在空间上执行析构函数完成对象中资源的清理工作。2.再用operator delete函数释放对象的空间。class person { public: //virtual ~person() { cout ~person() endl; } }; class student :public person { public: ~student() { cout ~student() endl; } }; int main() { person* pnew person; person* snew student; delete p; //~persondelete p delete s; return 0; }如果不加virtual的话可以看出只析构了student类中person的部分会造成内存泄漏。但是加上virtual的话我们就没有这个烦恼了。override和final关键字override可以帮助用户检测虚函数是否重写当我们不小心拼写错误时编译器并不能直接检查出来加上override皆可以检测出来了。final我们不想让派生类重写虚函数时可以用。纯虚函数和抽象类纯虚函数在虚函数的后面写上0这个函数就是纯虚函数了。virtual void buytic()0 { cout 全价 endl; }抽象类包含纯虚函数的类叫做抽象类。抽象类不能实例化出对象所以在某种程度上也强制了派生类重写虚函数。因为不重写派生类也是抽象类不能实例化出对象

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询