`
duoerbasilu
  • 浏览: 1474531 次
文章分类
社区版块
存档分类
最新评论

C++虚函数和多态性的关系【virtual】之二

 
阅读更多

在我上一篇的文章中,我把我对虚函数和多态性的关系发表了出来,经过这些天的思考、探讨和查资料,现在我有了更深一层的理解,现记录在此,如大家有更好的理解,也请大家不吝赐教【我上一篇博文的地址是:C++虚函数和多态性的关系【virtual】之一

在上一篇的博文中,我说:如果没有虚函数【也就是virtual声明的函数】,那么C++的多态性就无法解释了,所以说,虚函数使C++具有了多态性!

经过这些天的探讨,在此表示这句话是有点问题的。首先,多态性的有无,和虚函数没有必然的联系,我们只能说,在基类里声明虚函数,这只是多态性的表现形式。【有关虚函数的探讨,我将在后面另写一篇文章】

下面,我们要先理解多态性的概念:不同的对象收到同一消息可以进行不同的响应,产生完成不同的结果

好,下面我先上代码:

#include <iostream>
using namespace std;

class Base
{
public:
	virtual void test()
	{
		cout<<"Base"<<endl;
		//printf("Base\n");
	}
protected:
private:
};

class A:public Base
{
public:
	 void test()
	{
		cout<<"Base--A"<<endl;
		//__super::test();
	}
protected:
private:
};

class B:public Base
{
public:
	 void test()
	{
		cout<<"Base--B\n"<<endl;
	}
protected:
private:
};
void funcall(Base* base)
{
	base->test();
}
int main()
{
	Base* base = new Base();
	funcall(base);  //Base

	base = new A();
	funcall(base); //A
	
	base = new B();
	funcall(base); //B
	return 0;
}

其输出的结果是:

class Base 是基类,class A 和class B继承与class Base。这三个就是不同的对象,当三个不同的对象接收到同一个消息是:test(),其做出了不同的响应,这就是函数的多态性。

其实,我感觉用现实的事物做比喻这就更加形象:不同的哺乳动物有不同的呼吸方式,但是不管怎么样,我们先把呼吸这个抽象的概念放在一个基类里面,然后我们再将其具体化,猫和狗的呼吸方式,就是两种多态性的表现。

分享到:
评论

相关推荐

    虚函数c++语言

    虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名...

    c++ 虚函数与纯虚函数的区别(深入分析)

    因为它充分体现 了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说, 它们都是虚函数。难怪有人甚至称虚函数是C++语言的精髓。...

    C++中虚函数与纯虚函数的用法

    本文较为深入的分析了C++...虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略。纯虚函数则是一种特殊的虚函数。虚函数联系到多态,多态联系到

    浅析C++中的虚函数

    用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数 虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public。 定义为virtual的函数是基类期待派生类重新定义的,基类希望...

    C++多态的实现及原理详细解析

    分为类的多态性和函数的多态性。4. 多态用虚函数来实现,结合动态绑定。5. 纯虚函数是虚函数再加上= 0。6. 抽象类是指包括至少一个纯虚函数的类。 纯虚函数:virtual void breathe()=0;即抽象类!必须在子类实现这...

    深入理解C++的多态性

    C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。...(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函数,只有重写了虚函数的才能算作是体现了C++多态性)而重载则是允许有多

    虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析

    c++虚函数1.定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数 [1]2.语法:virtual 函数返回类型 函数名(参数表) { 函数体 }3.用途:实现多态性,通过指向派生类的基类指针,访问派生...

    C++虚析构函数的使用分析

    虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的。析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,析构函数最好都是virtual的。首先...

    详解C++ 多态的实现及原理

    C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用...

    C语言干货

    程序编译时多态性体现在函数和运算符的重载上,在程序运行时的多态性通过继承和虚函数来体现。 2. 虚函数:在基类中冠以关键字 virtual 的成员函数。它提供了一种接口界面。允许在派生类中对基类的虚 函数重新定义。...

    C++程序设计_中型项目 游戏"双人大战"的控制台实现.pdf

    3.对虚基类(virtual base class),派生类,类的实例化,动态联编(dynamic binding)等体现面向对象多态性内容的体现; 4.小组合作完成同意大型项目的配合能力,; 在实际操作方面,本次试验重点训练了: 1.继承关系的创建,...

    The implementation mechanism for C++ virtual function

    C++这门语言是一门比较复杂的语言,光从这门语言本身去学习是不够的。 要想更好的使用C++这门编程语言,我们需要了解C++后面的一些东西。 功能点很多,泛泛而谈恐怕效果不是太...焦点也集中在虚函数和多态性这一点。

    C++ 基础教程之虚函数实例代码详解

    虚函数的作用:在于用专业术语来解释就是实现多态性,多态性是将接口与实现进行分离,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数;用形象的语言来解释就是实现以共同的方法,但因个体差异,而...

    简单解读C++中的虚函数

    虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。下面来看一段简单的代码 class A{ ...

    C++多态的实现机制深入理解

    分为类的多态性和函数的多态性。 4. 多态用虚函数来实现,结合动态绑定。 5. 纯虚函数是虚函数再加上= 0。 6. 抽象类是指包括至少一个纯虚函数的类。 多态的简单介绍 一般来说,多态分为两种,静态

    C++语言中类、继承、多态等的用法?

    所谓多态性是指当不同的对象收到相同的消息时,产生不同的动作。 class CBase { public: virtual void FuncA(void){cout”This is CBase ::FuncA\n”} //用关键字virtual声明一个虚函数 }; void Test(CBase ...

    多态性实验报告.doc

    浙江理工大学信息学院 面向对象程序设计实验报告 实验名称:类的多态性的实现 学时安排:3 实验类别:设计性实验 实验要求:1人1组 学号: 姓名:  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄...

    C语言实现对象编程之多态代码.rar

    例如:使用接口(interface)包含多个指向函数的指针,这样就可以实现操作的"多态性"。 在面向对象语言C++的实现上,使用了虚函数的方式,虚函数实质上也是指向虚表(virtual table)的一个函数指针。C++虚表方式的本质...

    华为C++笔试题全部汇总

    [重载操作符声明为virtual使操作符产生多态性] return 0; } 程序的输出结果是_B_: A、I am Base class ! I am base class ! B、I am Derive class ! I am Derive class ! C、I am base class ! I am Derive class ...

    新手学习C++入门资料

    C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。 C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数。 二、关键字和变量 C++相对与C增加了一些关键字,如下: ...

Global site tag (gtag.js) - Google Analytics