C++中的虚函数(virtual function)

http://tech.ddvip.com   2007年03月16日    社区交流

本文详细介绍C++中的虚函数(virtual function)

  1.简介

  虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:

class A
{
public:
  virtual void foo() { cout << "A::foo() is called" << endl;}
};
class B: public A
{
public:
  virtual void foo() { cout << "B::foo() is called" << endl;}
};

  那么,在使用的时候,我们可以:

  A * a = new B();

  a->foo();    // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!

  这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。

  虚函数只能借助于指针或者引用来达到多态的效果,如果是下面这样的代码,则虽然是虚函数,但它不是多态的:

class A
{
public:
  virtual void foo();
};
class B: public A
{
  virtual void foo();
};
void bar()
{
  A a;
  a.foo();  // A::foo()被调用
}
1.1 多态

  在了解了虚函数的意思之后,再考虑什么是多态就很容易了。仍然针对上面的类层次,但是使用的方法变的复杂了一些:

void bar(A * a)
{
  a->foo(); // 被调用的是A::foo() 还是B::foo()?
}

  因为foo()是个虚函数,所以在bar这个函数中,只根据这段代码,无从确定这里被调用的是A::foo()还是B::foo(),但是可以肯定的说:如果a指向的是A类的实例,则A::foo()被调用,如果a指向的是B类的实例,则B::foo()被调用。

作者:张笑猛    责编:豆豆技术应用

正在加载评论...