c++虚函数

原创 2012年03月30日 16:38:26

假设有一个func函数,派生类里重写了基类的里的这个函数。那么这个派生类里的这个函数只有派生类的对象才可以调用。因为一个派生类的对象作为一个基类对象的引用或者是一个基类的指针指向这个派生类,它们的行为都像一个基类对象的行为。通过这个指针来调的话,将调用基类的func函数。如果一个变量是基类的引用,引用的是一个派生类的对象,或者派生类的对象传给函数(值传递或者应用传递)函数的形参是基类类型,那么基类的func()函数将被调用

#include <iostream.h>

 

class Base

{

public: 

virtual void func( )

{cout << "Base class function.\n";}

};

 

class Derived : public Base

{

public: 

void func( )

{cout << "Derived class function.\n";}

};

 

void foo(Base& b)

{ b.func( ); }

 

int main( )

{

  Derived d;

  Base b;

  Base* p = &d;

  Base& br = d;

 

   b= d;  // i = j;

  b.func( );

  d.func( );

   p-> func( );

  foo(d);

  foo(b);

   br.func();

 

  return 0;

}

在一些具体的应用中,一个基类的指针指向派生类的对象,它想要调用派生类中重写的父类的函数。它的行为是一个基类的行为。这种情况下,我们把这个函数声明为虚函数。使得这个指向派生类的指针能够调用派生类里重写的方法

 

使用虚函数,如果一个派生类的对象的引用当作基类对象的引用传参,或者是一个基类的指针(指向派生类的对象),派生类的函数将会被调起,而没有使用指针或引用的向下类型转换。

附注

如果一个派生类的对象给一个基类的对象赋值,左值不会转换成一个派生类的对象。如果派生类对象作为参数传给一个函数,值传递,参数的接受类型为基类类型。正式的,我们给它传一个基类的对象。在这种情况下,基类版本的虚函数将会被调用

如果是基类的指针或引用指向派生类,调用虚函数。派生类版本的函数将会被调用

在一个有虚函数的类里,当一个基类的指针被delete,基类的析构函数会被调用。但是,如果这个指针指向派生类的对象。那么仅仅只有基类的析构被调用,而不是通过在派生类的对象。

析构一个派生类的对象,当我们使用delete操作符来delete一个指向派生类对象的基类指针时,必须要保证派生类的析构函数被调用

这意味着基类的析构函数必须是虚函数。因此,如果你声明一个类有派生类的话,这个类的析构函数最好是虚函数。有没有必要声明一个类的析构函数是虚函数的一个规则就是,看这个类是否有子类。

#include <iostream.h>

#include <string.h>

 

class Thing

{

public:

virtual void what_Am_I( ) {cout << "I am a Thing.\n";}

 

~Thing(){cout<<"Thing destructor"<<endl;}

};

 

class Animal : public Thing

{

public:

virtual void what_Am_I( ) {cout << "I am an Animal.\n";}

 

~Animal(){cout<<"Animal destructor"<<endl;}

};

 

void main( )

{

   Thing  t ;     

   Animal x ;

   Thing* array[2];

 

   array[0] = &t;               // base pointer

   array[1] = &x;           

 

for (int i=0;i<2; i++) 

array[i]->what_Am_I() ;

 

   return ;

}

如果对象能够动态允许我们使用delete来释放空间,并且保证能够正确的释放内存

delete  一个指向对象的指针,这将调用次对象的析构函数。但是,如果这个对象是由基类的指针指向的,那么只会调用基类的析构函数。

#include <iostream.h>

#include <string.h>

 

class Thing

{ public:

virtual void what_Am_I( ) {cout << "I am a Thing.\n";}

~Thing(){cout<<"Thing destructor"<<endl;}

};

 

class Animal : public Thing

public:

void what_Am_I( ) {cout << "I am an Animal.\n";}

~Animal(){cout<<"Animal destructor"<<endl;}

};

 

int main( )

{

     Thing* t =new Thing();     

Animal*  x = new Animal();   // Thing* y = new Animal();  delete y;

x-> what_Am_I() ;

   Thing* array[2];

 

   array[0] = t;                         // base pointer

   array[1] = x;         

 

for (int i=0;i<2; i++) 

array[i]->what_Am_I() ;

 

   delete array[0];

   delete array[1];

   return  0;

}

 

如果在一个类里的函数是虚函数,或者说这个类有子类。一定要确认这个类的析构函数为虚函数。如果基类的析构函数为虚函数,那么子类的析构函数也是虚函数。

当虚函数被一个基类对象的引用调用时,或者被一个基类指针调用时,它的行为依靠对象的真实身份。这在运行时才能确定的。这就叫做动态绑定

动态绑定使得程序有这样一种能力,注意这些代码,在将来的某个时刻被加载。设想一下,在一段程序里,一个虚函数被基类的引用调用。根据对象的真实身份,基类的还是派生类的,类里的成员函数会被调用。定义一个派生类,在派生类里重写虚函数。在新的派生类里定义这个对象的引用。如果是这样的话,新的派生类的函数将会被调用。而不用修改原有的代码。



本文来源:http://blog.csdn.net/pzw0416/article/details/7392655

如需转载,请注明出处


C++虚函数简单的例子

#include #include using namespace std; class A { public: A(){}; virtual void Fun() { cou...
  • taoerit
  • taoerit
  • 2014年08月26日 12:26
  • 806

C++虚函数简单总结

函数简单学习记录
  • My_heart_
  • My_heart_
  • 2016年07月07日 14:39
  • 333

C++学习笔记之多态(虚函数)

多态可以分为静态的多态和动态多态,静态多态即所谓的函数重载,在编译阶段即可确定是使用哪个函数。动态多态是通过虚函数来实现的,并基于类的继承来表现。 在使用过程中应注意以下几点: 1、虚函数使用过程中,...
  • ljp1919
  • ljp1919
  • 2015年10月03日 15:16
  • 965

c++——虚函数例子代码

#include using namespace std; class VirtualBase { public: virtual void Demo() = 0; virtual...
  • qq_18860653
  • qq_18860653
  • 2017年02月09日 09:00
  • 285

C++ 虚函数经典深入解析

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术...
  • gggg_ggg
  • gggg_ggg
  • 2015年05月22日 11:53
  • 1559

c++虚函数的使用方法

虚函数的使用方法: (1)在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便被调用。 在类外定义虚函数时,不必在定义virtual ...
  • tian_123456789
  • tian_123456789
  • 2016年05月08日 13:04
  • 9149

c++ 类大小(含虚函数)

虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难。我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术。说明一点...
  • FrankieWang008
  • FrankieWang008
  • 2011年12月20日 13:06
  • 2840

【C++拾遗】 C++虚函数实现原理

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50454819我们知道,与C语言相比,C++在布局和存取时间上的额外开销主要是由虚...
  • Xiejingfa
  • Xiejingfa
  • 2016年01月04日 15:47
  • 1551

C++虚函数的定义与意义

我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。例如在例...
  • u011392772
  • u011392772
  • 2015年01月30日 09:55
  • 1680

c++类中的虚函数

类中虚函数的作用
  • u011484045
  • u011484045
  • 2015年07月13日 16:49
  • 957
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++虚函数
举报原因:
原因补充:

(最多只允许输入30个字)