关闭

虚函数的概念与使用

标签: 虚函数
213人阅读 评论(0) 收藏 举报
分类:

C++为了使用多态的特性,引入了虚函数。

虚函数的作用是允许在子类中重新定义与父类同名的函数,并且可以通过父类的指针或引用来访问父类和子类中的同名函数。

所以只有重写了虚函数才能算作体现了C++的多态特性。

虚函数的使用:

1、在父类中用virtual来修饰要实现多态的函数,这样的函数就被称为虚函数。

这样就可以在子类中重新定义此函数,为它赋予新功能,并能方便地进行调用。

2、在子类中重新定义此函数,要求函数名,函数类型、返回值类型,函数参数个数和类型全部与父类的虚函数相同,并要根据子类的需要重新定义函数功能。

C++规定,当一个成员函数被定义为虚函数后,其子类中的同名函数都自动成为虚函数。

因此在子类重写虚函数的时候,可以不写virtual(最好写一下,看得清楚)。

如果子类并没有重写虚函数,则子类简单地继承其直接父类的虚函数。

3、定义父类指针,并使该指针指向同一类族中的需要调用“那个虚函数”的对象的内存地址。

4、通过该指针调用虚函数,此时调用的就是相应的虚函数。


注意:

1、只有类的成员函数才能定义为虚函数。

2、静态成员函数不能是虚函数,因为它不受限于某个对象。

3、内联函数不能是虚函数。

4、构造函数不能是虚函数。

5、析构函数可以是虚函数。

代码示例:

class Shape             //父类
{
 public:
  double calcArea()
 {
   cout<<"calcArea"<<endl;
   return 0;
 }
};

class Circle:public Shape    //子类1
{
 public:
  Circle(double r);   //构造函数功能实现部分省略  
  double calcArea()
 {
   return 3.14*m_dR*m_dR;
  }
 private:
  double m_dR;
};

class Rect:public Shape     //子类2
{
 public:
  Rect(double width,double height);  //构造函数功能实现部分省略
  double calcArea()
 {
  return m_dWidth*m_dHeight;
 }
 private:
  double m_dWidth;
  double m_dHeight;
};

int main()    //主函数
{
  Shape *shape1=new Circle(4.0);
  Shape *shape2=new Rect(3.0,5.0);
  shape1->calcArea();                   
  shape2->calcArea();
  ......
  return 0;
}

如上所示,不使用virtual,虚函数。调用的结果只会是父类的calcArea函数被调用。所以这时应该使用虚函数。

class Shape             //父类
{
 public:
 virtual double calcArea()    //把要实现多态的函数写为虚函数
 {
   cout<<"calcArea"<<endl;
   return 0;
 }
};

class Circle:public Shape    //子类1
{
 public:
  Circle(double r);   //构造函数功能实现部分省略  
 virtual double calcArea()      //函数名相同的函数写为虚函数(此时不是必须,
 {                                如果省略,编译器将会自动添加)
   return 3.14*m_dR*m_dR;
  }
 private:
  double m_dR;
};

class Rect:public Shape     //子类2
{
 public:
  Rect(double width,double height);  //构造函数功能实现部分省略
  virtual double calcArea()   //同上      
 {
  return m_dWidth*m_dHeight;
  }
 private:
  double m_dWidth;
  double m_dHeight;
};

int main()       //主函数
{
  Shape *shape1=new Circle(4.0);
  Shape *shape2=new Rect(3.0,5.0);
  shape1->calcArea();                   
  shape2->calcArea();
  ......
  delete shape1;
  ...
  delete shape2;
  ...
  return 0;
}

如上例,此时调用的结果就是相应的函数被调用。







0
0
查看评论

Chapter12——请比较函数重载和虚函数在概念上和使用方式有什么区别

函数重载的定义是:在同一作用域(如:类)中,几个函数名字相同但参数列表(参数类型,参数个数)不全相同。 虚函数的定义是:在基类中用关键词“virtual”声明成员函数,然后在派生类中正式定义或重新定义此函数,其中要求函数名、函数类型、参数类型和个数必须与基类虚函数相同。 所以函数重载和虚函数在概念上...
  • ping1jing2
  • ping1jing2
  • 2017-05-09 15:01
  • 1090

多态与虚函数,纯虚函数的概念

首先,在了解什么是多态之前,要了解什么是虚函数,虚函数对于多态具有决定性的作用,有虚函数才能构成多态。怎么样创建一个含有虚函数的类呢,其实就是函数类型前面加上关键字virtual,借助虚函数,基类指针既可以使用基类的成员函数,也可以使用派生类的成员函数,它有多种形态,或多种表现方式,这就是多态。 多...
  • Cineze
  • Cineze
  • 2016-08-22 14:36
  • 682

函数重载与虚函数的区别

函数重载和虚函数在概念和使用方式方面的区别1.函数重载可以用于非成员函数和类的成员函数,而虚函数只能用于类的成员函数2.函数重载可用于构造函数,而虚函数不能用于构造函数3.如果对成员函数进行重载,重载的函数与被重载的函数应该是用一个类中的成员函数,不能分属于两个不同继承层次的类,函数重载处理的是横向...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2015-05-13 19:13
  • 2092

函数重载和虚函数在概念和使用方式方面的区别

函数重载和虚函数在概念和使用方式方面的区别 1.函数重载可以用于非成员函数和类的成员函数,而虚函数只能用于类的成员函数 2.函数重载可用于构造函数,而虚函数不能用于构造函数 3.如果对成员函数进行重载,重载的函数与被重载的函数应该是用一个类中的成员函数,不能分属于两个不同继承层次的类,函数重载...
  • cuiyi23
  • cuiyi23
  • 2012-10-14 16:31
  • 1269

函数重载是什么意思?它与虚函数的概念有什么区别?

函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数、参数类型不同,函数的返回值来区分该调用哪一个函数,即实现的是静态的多态性。但是记住:不能仅仅通过函数返回值不同来实现函数重载。   而虚函数实现的是在基类中通过使用关键字virtual来申明一个函数为虚函数,含义...
  • scdxmoe
  • scdxmoe
  • 2013-10-10 14:32
  • 1255

c++中的虚函数、虚基类、类模板

一、虚函数 首先要明白C++为什么要引进虚函数这个机制, 虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。 从以上的定义来看,需函数简单的说就是为了让基类指针能...
  • zyazky
  • zyazky
  • 2016-08-15 14:17
  • 1641

虚函数和多态性---总结

  l         虚函数和多态性使得设计和实现易于扩展的系统成为可能。在程序开发过程中,不论类是否已经建立,程序员都可以利用虚函数和多态性先编写这些类对象的程序。l   &#...
  • xuexiuyin
  • xuexiuyin
  • 2007-06-07 10:32
  • 1814

虚函数对于dynamic_cast转换的作用

虚函数对于dynamic_cast转换的作用   为何使用dynamic_cast转换类指针时,需要虚函数呢。 Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继承关系等)。 如何在运行时获取到这个信息——虚函数表。   C++对象模型中,对象实例最前面的就...
  • jiaoyongqing134
  • jiaoyongqing134
  • 2016-08-31 14:19
  • 845

Python中的多态与虚函数

1.前言    C++中的
  • Tony_Wong
  • Tony_Wong
  • 2014-09-28 11:39
  • 6242

C++ 复习 :知识点 多态性与虚函数

2017-6-18    1 多态性定义,作用.为什么会引入它。 2 虚函数的定义,作用,为什么会引入它。 3 向上类型的定义,作用。 4 捆绑定义,早捆绑,晚捆绑,为什么要实现捆绑。 5 虚函数的扩展性, 6 如何实现晚捆绑,存放型信息、功能演示、。 7 抽象类和纯虚函数。 8...
  • cwcww1314
  • cwcww1314
  • 2017-06-18 17:35
  • 222
    文章分类
    文章存档