C++中虚函数学习笔记

原创 2004年10月14日 22:47:00

                                                                    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++,恩,能说的就这么多,下次说说多态。88~~~~

 

版权声明:本文为黑夜路人原创文章,未经允许请勿转载

C++中虚函数的作用是什么?它应该怎么用呢?

 虚函数联系到多态,多态联系到继承。所以本文中都是在继承层次上做文章。没了继承,什么都没得谈。 下面是对C++的虚函数这玩意儿的理解。 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那...
  • wang7890
  • wang7890
  • 2009年04月02日 11:04
  • 2964

c++类中的虚函数

类中虚函数的作用
  • u011484045
  • u011484045
  • 2015年07月13日 16:49
  • 957

C++中虚函数的用法详细讲解

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

C++模板类的虚函数成员

C++模板类只有在被使用的时候才会被特化,同样其成员函数也是在被使用的时候才被实例化。但是虚函数成员例外,原因应该是在定义一个模板类类型的变量时(使用模板类),为了确定虚函数表的大小,就已经实例化了虚...
  • sinat_35261315
  • sinat_35261315
  • 2016年11月11日 10:06
  • 953

c++虚函数的使用方法

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

想法:C++私有虚函数

在实现C++多态时,如果提供了接口
  • l1095260368
  • l1095260368
  • 2014年04月22日 09:10
  • 466

C++中的虚函数(virtual function) (细节,决定成败) (写得很好)

1.简介     虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次: class A { public: ...
  • bao_jinyu
  • bao_jinyu
  • 2012年08月08日 14:16
  • 16097

C++中虚函数是怎样实现的

C++中虚函数是怎样实现的
  • A_LMY
  • A_LMY
  • 2016年03月04日 16:21
  • 846

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

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

c/c++-虚函数和重载

1. 重载 1.1 简单重载       在C++中,是允许同名函数的存在 int add(int i,int j); float add(float i,float);    ...
  • wangwangfish
  • wangwangfish
  • 2012年10月16日 08:38
  • 1703
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中虚函数学习笔记
举报原因:
原因补充:

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