`
totoxian
  • 浏览: 1074131 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

虚函数释义

 
阅读更多

//类型兼容规则举例
#include "stdafx.h"

#include <iostream>

using namespace std;

class B0//基类B0声明
{
public:
void display(){cout<<"B0::display()"<<endl;}//公有成员函数
};

class B1: public B0//公有派生类B1声明
{
public:
void display(){cout<<"B1::display()"<<endl;}//公有成员函数
};

class D1: public B1//公有派生类D1声明
{
public:
void display(){cout<<"D1::display()"<<endl;}//公有成员函数
};

void fun(B0 *ptr)//普通函数
{//参数为指向基类对象的指针
ptr->display();//"对象指针->成员名"
}
void main()//主函数
{
B0 b0;//声明基类B0类对象
B1 b1;//声明B1类对象
D1 d1;//声明D1类对象
B0 *p;//声明B0类指针
p=&b0;//B0类指针指向B0类对象,
fun(p);
p=&b1;//B0类指针指向B1类对象,指向基类的指针也可以指向派生类。
fun(p);
p=&d1;//B0类指针指向D1类对象,指向基类的指针也可以指向派生类。
fun(p);
}

输出结果:

B0::display()
B0::display()
B0::display()
Press any key to continue

//类型兼容规则举例
#include "stdafx.h"

#include <iostream>

using namespace std;

class B0//基类B0声明
{
public:
virtual void display(){cout<<"B0::display()"<<endl;}//公有成员函数
};

class B1: public B0//公有派生类B1声明
{
public:
void display(){cout<<"B1::display()"<<endl;}//公有成员函数
};

class D1: public B1//公有派生类D1声明
{
public:
void display(){cout<<"D1::display()"<<endl;}//公有成员函数
};

void fun(B0 *ptr)//普通函数
{//参数为指向基类对象的指针
ptr->display();//"对象指针->成员名"
}
void main()//主函数
{
B0 b0;//声明基类B0类对象
B1 b1;//声明B1类对象
D1 d1;//声明D1类对象
B0 *p;//声明B0类指针
p=&b0;//B0类指针指向B0类对象,
fun(p);
p=&b1;//B0类指针指向B1类对象,指向基类的指针也可以指向派生类。
fun(p);
p=&d1;//B0类指针指向D1类对象,指向基类的指针也可以指向派生类。
fun(p);
}

输出结果:

B0::display()
B1::display()
D1::display()
Press any key to continue

虚函数是为了实现某种功能而假设的函数,虚函数只能是类中的一个成员函数,不能是静态成员,使用关键字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

分享到:
评论

相关推荐

    虚函数内存模型

    本文将深入探讨虚函数内存模型,解释当虚函数被引入到类中时,对象的内存布局会发生哪些变化。 #### 二、基本概念与背景 1. **虚函数表(vtable)**:每个包含虚函数的类都会有一个虚函数表,它是一张表格,其中...

    C++中虚函数的实现机制

    ### C++中虚函数的实现机制 #### 一、虚函数的概念及其重要性 在C++编程语言中,虚函数是实现多态性的关键机制之一。多态性是指同一个操作作用于不同的对象,可以有不同的解释,进而触发不同的行为。在面向对象...

    虚函数代码列子

    虚函数在C++编程语言中是一个非常重要的特性,它允许我们实现多态性,这是面向对象编程中的核心概念。在给定的“虚函数代码例子”中,我们将深入探讨三种不同的方式来调用虚函数:通过对象、指针和引用。下面我们将...

    为什么构造函数不能是虚函数

    ### 为什么构造函数不能是虚函数 #### 一、引言 在面向对象编程中,构造函数和虚函数是两个非常重要的概念。构造函数用于初始化对象的状态,而虚函数则支持多态性,允许基类指针或引用调用派生类的方法。这两种机制...

    多态性与虚函数习题

    - **解释**: 虚函数的重新定义需要保持与基类中虚函数相同的参数个数和类型。 8. **答案**: A.对象指针 - **解释**: 动态联编通常是通过对象指针或引用实现的,这里指针是最常见的用法。 9. **答案**: C....

    C++中的虚函数与多态

    在C++编程语言中,虚函数(Virtual Functions)和多态(Polymorphism)是面向对象编程的重要特性,它们使得程序具有高度的灵活性和可扩展性。本文将深入探讨这两个概念,结合示例代码进行详细解释。 首先,我们来...

    C++虚函数调用机制初探

    本文旨在探讨C++中的虚函数调用机制,通过分析一个简单的示例程序,解释虚函数如何在运行时被正确地调用,并深入剖析这一过程背后的原理。 #### C++中的虚函数调用机制 C++中的虚函数调用机制主要依赖于虚拟表...

    多态的实现及虚函数

    ### 多态的实现及虚函数详解 #### 引言:多态的演变与意义 在计算机科学领域,随着技术的演进,程序设计语言经历了从低级到高级的跨越,其中面向对象编程语言(如C++、Java、C#等)的兴起,标志着软件设计思想的一...

    C#中虚函数,抽象,接口的简单说明

    C#中虚函数、抽象、接口的简单说明 在面向对象编程(OOP)中,虚函数、抽象类和接口是三个基本概念,它们在C#语言中也有对应的实现。下面我们将对这三个概念进行详细的解释。 虚函数(Virtual Function) 在C#中...

    虚基类 虚函数成员 虚析构函数

    在C++编程语言中,虚基类、虚函数成员和虚析构函数是面向对象编程中的关键概念,它们对于理解和实现多态性至关重要。多态性允许我们编写更灵活、可扩展的代码,使得程序能处理多种不同类型的对象。下面将详细解释这...

    C++_虚函数和纯虚函数区别(高清版).rar

    在C++编程语言中,虚函数(Virtual Functions)和纯虚函数(Pure Virtual Functions)是面向对象编程的重要特性,它们都是实现多态性的方式,但各自有着不同的应用场景和功能特点。下面将详细解释这两个概念以及它们...

    虚函数VC++最强解释.pdf

    虚函数是C++中实现多态性的重要机制,它允许我们通过基类指针或引用调用派生类中重定义的同名函数。在C++中,虚函数的使用可以使得程序更加灵活,能够根据对象的实际类型动态地执行相应的函数。 首先,要理解虚函数...

    基于虚函数的图形面积计算

    在编程领域,虚函数是面向对象编程中的一个重要概念,特别是在C++这种支持多态性的语言中。本项目“基于虚函数的图形面积计算”旨在利用虚函数实现对不同几何图形(如三角形、圆、梯形和矩形)面积的计算,并通过...

    CPP.rar_C++虚函数

    在C++编程语言中,虚函数(Virtual Functions)是一个核心特性,它允许我们实现多态性,这是面向对象编程中的重要概念。虚函数使得基类的指针或引用可以调用派生类重写后的成员函数,从而实现动态绑定。在“CPP.rar...

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

    ### C++中的虚函数(virtual function) 在C++编程语言中,虚函数是一种非常重要的特性,它主要用于实现多态性(polymorphism),这是面向对象编程的一个核心概念。通过虚函数,程序可以在运行时动态地决定调用哪个具体...

    xuhanshu.zip_C++xuhanshu_xuhanshu_虚函数

    在C++编程语言中,虚函数(Virtual Functions)和纯虚函数(Pure Virtual Functions)是面向对象编程中的重要概念,它们对于实现多态性(Polymorphism)起着关键作用。下面将详细解释这两个概念以及它们的区别。 1....

    C++函数中那些不可以被声明为虚函数的函数[参考].pdf

    以下是对C++中不可声明为虚函数的几种类型的详细解释: 1. 普通函数(非成员函数): 普通函数不属于任何类,因此无法通过继承关系进行多态调用。它们只能被重载,而不能被覆盖。由于虚函数机制依赖于类的继承,...

    为何要虚析构函数.docx

    此外,虚函数对应的虚函数表是存放在对象的内存空间里,如果构造函数是虚函数,就需要通过虚函数表来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到虚函数表,所以构造函数不能是虚函数。 虚析构函数...

Global site tag (gtag.js) - Google Analytics