21xrx.com
2024-11-08 23:25:51 Friday
登录
文章检索 我的文章 写文章
虚函数(virtual function)
2023-07-05 16:15:34 深夜i     --     --
多态(polymorphism) 继承(inheritance) 虚函数表(virtual function table) 纯虚函

虚函数是C++中的一种特殊函数,可以让子类继承父类的函数,在实现时进行覆盖和重写。虚函数是指在基类中不进行实现的函数,只有函数的原型和返回值。这些函数在派生类中进行实现,派生类可以覆盖它们,从而实现自己的逻辑。使用虚函数可以帮助我们更好地实现面向对象设计,将代码进行模块化和分层。

虚函数的声明方式是在函数的返回类型前面添加关键字“virtual”。以一个简单的例子来说明虚函数的用法:

class Shape {

public:

  virtual void draw()

    cout << "Draw shape" << endl;

};

class Rectangle: public Shape {

public:

  void draw()

    cout << "Draw Rectangle" << endl;

};

在这个例子中,基类Shape中声明了一个虚函数draw,并且给出了默认的实现,仅仅输出了“Draw shape”。在派生类Rectangle中,我们重新实现了这个函数,并输出了“Draw Rectangle”。当我们创建Rectangle类的对象并调用它的draw()函数时,输出的是“Draw Rectangle”,而不是基类Shape中的默认消息。

虚函数的实现依赖于虚函数表,每个类有一个虚函数表,即vtable,这个表保存了虚函数的地址。当对象调用虚函数时,程序会查找对象的虚函数表,然后根据函数编号(函数在虚函数表中的索引)获取函数地址并调用对应的函数。如果类中没有虚函数,那么它就不包含虚函数表。

虚函数的一个重要特点是它支持多态。多态意味着,派生类的对象可以使用基类的指针或引用进行操作,因为派生类继承了基类的所有成员函数。例如:

int main()

{

  Rectangle rect;

  Shape* shp = ▭ // 派生类对象赋值给基类指针

  shp->draw(); // 调用派生类中的draw函数

  return 0;

}

在上面的代码中,我们定义了一个Rectangle对象rect,并将它转换为Shape类型的指针shp。由于Rectangle是Shape的一个派生类,因此我们可以使用Shape指针调用Rectangle中定义的draw()函数。在这个例子中,输出的是“Draw Rectangle”。

虚函数是C++中非常重要的概念,它可以帮助程序员更好地实现面向对象的设计模式。使用虚函数的目的是让派生类对象可以使用基类指针或引用来访问其成员函数,从而实现多态。虚函数的实现依赖于虚函数表,每个类都有一个虚函数表,并且每个虚函数在表中有一个地址。虚函数是C++中实现多态的核心机制之一。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复