虚拟函数(C++)
虚拟int函数1(void);// 虚函数声明。 虚拟int函数2(void)=0;// 纯函数声明。
结构C{ 虚拟void f(){}=0;// 成形不良 };
结构TheClass { 虚虚函数3(虚)=0; }; 虚拟void TheClass::funct3(void) { //这里有一些代码。 };
注: 有关纯虚拟函数的讨论,请参见抽象类AbstractClasses。
它们只能是成员函数。 可以将其声明为 朋友 属于另一类。 它们不能是静态成员。
被覆盖的 事实上的 函数返回基类的指针或引用。 重写函数返回派生类的指针或引用。
结构X{};// 基类。 结构Y:X{};// 派生类。 结构B{ 虚拟void vf1(); 虚拟void vf2(); 虚拟void vf3(); 无效f(); 虚拟X*pf();// 返回类型是指向基的指针。 这个可以 //被覆盖。 }; D类:公共B类{ 公众: 虚拟void vf1();// 虚拟说明符合法但多余。 void vf2(int);// 不是虚拟的,因为它使用的是不同的 //参数列表。 这将隐藏B::vf2()。 //char vf3();// 非法:只返回类型更改! 无效f(); Y*pf();// 覆盖功能仅不同 //返回类型中。 返回指向的指针 //派生类。 }; 无效外部() { 日期;// 实例化D B*bp=&d;// 从D*到B的标准转换* //使用函数表初始化bp //为对象d提供。如果没有 //函数,使用函数 //在B表中。 bp->vf1();// 调用D::vf1 bp->vf2();// 调用B::vf2,因为D的vf2具有不同的参数 bp->f();// 调用B::f(非虚拟) X*xptr=bp->pf();// 调用D::pf()并转换结果 //指向指向X的指针。 D*dptr=&D; Y*密码=dptr->pf();// 调用D::pf()并初始化密码器。 //没有进行进一步的转换。 }