虚函数和多态
01 虚函数
- 在类的定义中,前面有
virtual
关键字的成员函数称为虚函数; virtual
关键字只用在类定义里的函数声明中,写函数体时不用。
class Base
{
virtual int Fun() ; // 虚函数
};
int Base::Fun() // virtual 字段不用在函数体时定义
{ }
02 多态的表现形式一
- 「派生类的指针」可以赋给「基类指针」;
- 通过基类指针调用基类和派生类中的同名「虚函数」时:
- 若该指针指向一个基类的对象,那么被调用是 基类的虚函数;
- 若该指针指向一个派生类的对象,那么被调用 的是派生类的虚函数。
这种机制就叫做“多态”,说白点就是调用哪个虚函数,取决于指针对象指向哪种类型的对象。
// 基类
class CFather
{
public:
virtual void Fun() { } // 虚函数
};
// 派生类
class CSon : public CFather
{
public :
virtual void Fun() { }
};
int main()
{
CSon son;
CFather *p = &son;
p->Fun(); //调用哪个虚函数取决于 p 指向哪种类型的对象
return 0;
}
上例子中的 p
指针对象指向的是 CSon
类对象,所以 p->Fun()
调用的是 CSon
类里的 Fun
成员函数。
- 派生类的对象可以赋给基类「引用」
- 通过基类引用调用基类和派生类中的同名「虚函数」时:
- 若该引用引用的是一个基类的对象,那么被调 用是基类的虚函数;
- 若该引用引用的是一个派生类的对象,那么被 调用的是派生类的虚函数。
这种机制也叫做“多态”,说白点就是调用哪个虚函数,取决于引用的对象是哪种类型的对象。
// 基类
class CFather
{
public:
virtual void Fun() { } // 虚函数
};
// 派生类
class CSon : public CFather
{
public :
virtual void Fun() { }
};
int main()
{
CSon son;
CFather &r = son;
r.Fun(); //调用哪个虚函数取决于 r 引用哪种类型的对象
return 0;
}
}
上例子中的 r
引用的对象是 CSon
类对象,所以 r.Fun()
调用的是 CSon
类里的 Fun
成员函数。
class A { public : virtual void Print() { cout fun1()
输出结果是什么呢?class Base { public: void fun1() { fun2(); } virtual void fun2() // 虚函数 { cout
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?