C++中虚函数学习笔记

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

C++中虚函数学习笔记

文/heiyeluren

因为最近学习C++的面向对象,所以了解了面向对象的三大特点: 封装、继承、多态性,学习多态性的时候,首先涉及的就是虚函数,我就把我学习虚函数的一些想法记录下来。

虚函数是为了实现某种功能而假设的函数,虚函数只能是类中的一个成员函数,不能是静态成员,使用关键字virtual用于在类中说明改函数是虚函数。 虚函数更是为了实现面向对象的多态性而产生的,使用虚函数和多态性能够简化代码长度,支持更简单的顺序,便于程序的调试,维护。

虚函数的定义方法:

class A

{

public:

virtual void fun(); //define virtual function

};

void A::fun() { ... } //member function describe

上面定义了一个虚函数,然后在类体外进行了函数的具体描述。

在类的继承当中,当基类中声明了某个虚函数,即使在派生类中没有声明虚函数,那么在以后的继承结构中都是虚函数,当然如果有多重继承,在每个派生类中还是推荐对每个虚函数进行显式的声明。

为了说明虚函数在派生类中的应用,我写段代码作例子:

//test.cpp

//code by heiyeluren

#include "stdio"

class cbase

{

public:

virtual void vfoo()

{

printf("vfoo from cbase\n");

};

void foo()

{

printf("foo from cbase\n");

}

};

class cderivd : public cbase

{

public:

virtual void vfoo()

{

printf("vfoo from cderivd\n");

};

void foo()

{

printf("foo from cderivd\n");

};

};

int main(int argc, char* argv[])

{

cbase* pbase = new cderivd();

pbase->foo(); //非虚函数,根据指针类型决定调用哪个foo,本例指针类型为cbase,所以调用的是cbase::foo()

pbase->vfoo(); //虚函数,调用的是派生类的vfoo

delete pbase;

cderivd* pd = new cderivd();

pd->foo(); //非虚函数,本例指针类型为cderivd*,所以调用cderivd::foo();

pd->vfoo();

delete pd;

cderivd d;

d.foo();

d.vfoo();

((cbase)d).foo();//将d强行切割为cbase,这时调用的无论是foo还是vfoo都将是base的

((cbase)d).vfoo();

getchar();

return 0;

}

程序在DevCPP下编译通过,输出:

foo from cbase

vfoo from cderivd

foo from cderivd

vfoo from cderivd

foo from cderivd

vfoo from cderivd

foo from cbase

vfoo from cbase

那么就能看出那个是虚函数,那个不是了吧。

说的不对的,请高手原谅,我也刚学C++,恩,能说的就这么多,下次说说多态。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航