c++虚函数(二)

来源:互联网 发布:单片机isp下载 编辑:程序博客网 时间:2024/06/15 08:44

二. 虚函数的语法
  虚函数的标志是“virtual”关键字。

2.1 使用virtual关键字
  考虑下面的类层次:

class A
{
public:
virtual void foo();
};

class B: public A
{
public:
void foo(); // 没有virtual关键字!
};

class C: public B // 从B继承,不是从A继承!
{
public:
void foo(); // 也没有virtual关键字!
};


  这种情况下,B::foo()是虚函数,C::foo()也同样是虚函数。因此,可以说,基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。

2.2 纯虚函数
  如下声明表示一个函数为纯虚函数:


class A
{
public:
virtual void foo()=0; // =0标志一个虚函数为纯虚函数
};


  一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。

2.3 虚析构函数
  析构函数也可以是虚的,甚至是纯虚的。例如:


class A
{
public:
virtual ~A()=0; // 纯虚析构函数
};

当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。考虑下面的例子:

class A
{
public:
A() { ptra_ = new char[10];}
~A() { delete[] ptra_;} // 非虚析构函数
private:
char * ptra_;
};

class B: public A
{
public:
B() { ptrb_ = new char[20];}
~B() { delete[] ptrb_;}
private:
char * ptrb_;
};

void foo()
{
A * a = new B;
delete a;
}


  在这个例子中,程序也许不会象你想象的那样运行,在执行delete a的时候,实际上只有A::~A()被调用了,而B类的析构函数并没有被调用!这是否有点儿可怕?

  如果将上面A::~A()改为virtual,就可以保证B::~B()也在delete a的时候被调用了。因此基类的析构函数都必须是virtual的。

  纯虚的析构函数并没有什么作用,是虚的就够了。通常只有在希望将一个类变成抽象类(不能实例化的类),而这个类又没有合适的函数可以被纯虚化的时候,可以使用纯虚的析构函数来达到目的。

2.4 虚构造函数?
  构造函数不能是虚的。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dchcuckoo/archive/2005/10/14/503999.aspx