`
java-mans
  • 浏览: 11741379 次
文章分类
社区版块
存档分类
最新评论

C++学习之多态

 
阅读更多

C++的类机制中有支持多态的技术来解决抽象编程,它用的是一种滞后捆绑技术,
这种技术,通过预先设定其成员函数的虚函数性质,使得任何捆绑该成员函数的未定类型的对象操作在编译时,都以一个不确定的指针特殊地“引命代发”来编码,
到了运行时,遇到确定类型的对象,才突然制定其真正的行为。即滞后到运行时,根据具体类型的对象来捆绑成员函数,这样,辨别对象类型的工作就可以不用用户做了。

虚函数(Virtual Function)
1.多态条件(Polymorphism Condition)
使用类编程中,要能进行抽象编程,不随类的改动而改动,类机制必须解决这个问题,在C++中,就是虚函数机制。基类与派生类的同名操作。只要标记上virtual,则该操作便具有多态性。
如下代码所示:

#include <iostream>
using namespace std;

class Base
{
public:
	virtual void fun()
	{
		cout << "In Base class" << endl;
	}
};

class Sub : public Base
{
public:
	virtual void fun()
	{
		cout << "In Sub class" << endl;
	}
};

void test(Base& b)
{
	b.fun();
}

int main()
{
	Base bc;
	Sub sc;
	test(bc);
	test(sc);

	return 0;
}

代码输出如下:

In Base class
In Sub class


上述代码中fun是Base类的虚函数,一旦标记了基类的函数为虚函数,则后面继承类中一切同名成员函数都编程了虚函数,在test函数中,b是Base类的引用性形参,Base类对象和Sub类对象都可以作为实参传给形参b。

如果函数参数是实际复制动作的传递,则子类对象完全变成基类对象了,这样,便不会有多态了。如将上述代码中的test函数参数改为如下形式时,

如下代码所示:

void test(Base b)
{
	b.fun();
}

int main()
{
	Base bc;
	Sub sc;
	test(bc);
	test(sc);

	return 0;
}


其输出则变为:

In Base class
In Base class


因为对于这种参数的传递过程已经将对象的性质做了肯定的转变,而对于确定的对象,是没有选择操作可言的。因此,对于多态,仅仅对于对象的指针和引用的间接访问,才会发生多态现象。

2. 虚函数机理

在上述代码中,b.fun()函数调用显示出多样性,其编译不能立即确定fun的确切位置,即不能确定到底是调用基类Base的fun函数,还是子类Sub的fun函数。

当编译器看到fun的虚函数标志时,以放入虚函数表中,等到遇到b.fun()这个虚函数的调用时,便将该捆绑操作滞后到运行中,以实际的对象类型来实际捆绑其对应的成员函数操作。当然编译器不可能跟踪到运行的程序中去,而是在捆绑操作b.fun()处避开函数调用,只做一个指向实际对象的成员函数的间接访问。如此,实际对象若是基类,则调用的就是基类成员函数,若是子类,则调用的就是子类的成员函数。当然,每一个实际的对象都必须额外占有一个指针空间,以指向类中的虚函数表。如下图所示。

从图中可以看处,用了虚函数的类,其对象的空间比不用虚函数的类多了一个指针的空间,由于涉及了其他的操作,包括间接访问虚函数,对象的指针偏移量计算等,所以在应用了虚函数后,会影响程序的运行效率。

3.虚函数的传播

虚函数在继承层次结构中总是会自动地从基类传播下去。因此,上述代码中Sub类中的成员函数fun的virtual说明可以省略,

例如下面的例子:

在一个平面形状类的体系中,基类shape有两个子类:圆Circle类和长方形Retangle类,专门负责求面积的Area函数在基类中设置为virtual就能使子类的响应同名函数虚拟化。

#include<iostream>
#include <cmath>

using namespace std;

class Shape
{
protected:
	double xCoord, yCoord;
public:
	Shape(double x, double y)
	{
		xCoord = x;
		yCoord = y;
	}
	virtual double area()const
	{
		return 0.0;
	}
};

class Circle : public Shape
{
protected:
	double radius;
public:
	Circle(double x, double y, double r) : Shape(x, y)
	{
		radius = r;
	}
	double area()const
	{
		return 3.14 * radius * radius;
	}
};

class Rectangle : public Shape
{
protected:
	double x2Coord, y2Coord;
public:
	Rectangle(double x1, double y1, double x2, double y2) : Shape(x1, y1)
	{
		x2Coord = x2;
		y2Coord = y2;
	}
	double area()const;
};

double Rectangle::area()const
{
	return abs((xCoord - x2Coord) * (yCoord - y2Coord));
}

void fun(const Shape& sp)
{
	cout << sp.area() << endl;
}

int main()
{
	fun(Circle(2, 5, 4));
	fun(Rectangle(2, 4, 1, 2));

	return 0;
}


分享到:
评论

相关推荐

    C++多态技术的实现和反思

    《C++多态技术的实现和反思》一文深入探讨了C++中多态特性的实现原理及其在实践中的应用与局限性。多态作为面向对象编程的核心特性之一,允许程序在运行时根据对象的实际类型调用相应的成员函数,从而提高了代码的...

    C++ 补充-多态

    C++补充-多态,简绍了有很多有用的东西,值得学习参考!希望对你有用!

    c++ 的封装继承多态例子

    在C++编程语言中,封装、...通过学习和实践这些例子,开发者能够更好地理解和掌握C++的面向对象编程技巧,从而编写出更高效、更易于维护的代码。在实际开发中,封装、继承和多态是设计模块化、可扩展系统的关键工具。

    C++继承与多态课件

    C++是一种强大的面向对象编程语言,其核心特性之一就是继承与多态。这两个概念是OOP(面向对象编程)中的基石,为代码复用和设计灵活性提供了基础。 **继承(Inheritance)**是C++中类的一个关键特性,它允许一个类...

    C++多态.多态与抽象描述.zip

    在C++编程语言中,多态(Polymorphism)是一个核心特性,它允许我们使用一个接口来表示多种不同的类型,增强了代码的灵活性和可扩展性。...通过不断实践和学习,我们可以更好地利用C++的多态性来解决实际问题。

    C++多态PPT

    在C++编程语言中,多态性(Polymorphism)是面向对象编程的三大核心特性之一,另外两个是封装和继承。多态性允许我们使用一个接口来表示多种不同的类型,它使得代码更加灵活、可复用且易于维护。在C++中,多态主要...

    C++开发基于多态的公司职工管理系统(课设源码).zip

    C++开发基于多态的公司职工管理系统(课设源码).zipC++开发基于多态的公司职工管理系统(课设源码).zipC++开发基于多态的公司职工管理系统(课设源码).zipC++开发基于多态的公司职工管理系统(课设源码).zipC++开发基于...

    C++实验代码(关于类与多态的实验)

    在C++编程语言中,类和多态是两个核心概念,它们构成了面向对象编程的基础。本实验代码集合专注于这两者,旨在帮助学习者深入...因此,这个“C++实验代码(关于类与多态的实验)”是每个C++学习者不容错过的宝贵资源。

    C++实验四多态程序设计.pdf

    C++实验四多态程序设计 在本实验中,我们将学习如何定义类和对象,掌握类的成员的访问控制,理解构造函数和析构函数的含义和作用,并学习如何重载运算符和实现类的成员函数。同时,我们还将了解 C++面向对象程序...

    c++实现基于多态的职工管理系统(无需会员)

    在C++编程中,多态性是面向对象编程的一个核心特性,它允许不同的对象对同一消息做出不同的响应。...通过理解和学习这个项目,开发者可以提升他们的C++编程技巧,并对面向对象设计有更深入的理解。

    C++课后小练习(类、继承、多态等有关小程序)

    在C++编程语言的学习过程中,类(Class)、继承(Inheritance)和多态(Polymorphism)是核心概念,它们构成了面向对象编程的基础。在这个“C++课后小练习”中,初学者可以通过一系列小程序来深入理解和应用这些知识...

    C++随堂测试(继承、多态、重载)(答案).docx

    C++随堂测试(继承、多态、重载) 本资源摘要信息涵盖了C++编程语言中三个重要的概念:继承、多态和重载。...本资源摘要信息涵盖了C++编程语言中继承、多态和重载三个重要概念的知识点,对于学习C++的读者非常有帮助。

    c/c++面试题(一些常出的面试题,包括多态,继承,函数参数等常考的内容)

    在C++中,多态性是面向对象编程的三大特性之一,另外两个是封装和继承。多态性允许不同的对象对同一消息做出不同的响应,实现灵活和通用的代码设计。C++支持两种类型的多态:静态多态(编译时多态)和动态多态(运行...

    C++继承与多态性实验报告

    本实验旨在通过实际操作加深学生对C++面向对象编程的理解,特别是针对继承与多态性的概念进行深入学习。实验要求学生能够利用C++语言特性,设计并实现具有继承与多态特性的程序,以此来培养学生的实践能力和解决问题...

    C++程序设计-封装、继承多态应用示例

    在C++编程语言中,封装、继承和多态是面向对象编程(OOP)的三大核心概念。这些特性使得C++能够构建出高效、模块化的软件系统。下面将详细解释这三个概念及其在“C++程序设计-封装、继承多态应用示例”中的体现。 1...

    C++-05继承和多态

    C++继承和多态的学习笔记

    c++ 图形面积计算 利用继承与多态

    通过这个项目,初学者不仅可以学习到C++的基础知识,还能了解到面向对象编程中的核心概念,以及如何将这些概念应用于实际问题中。对于后续更复杂的问题,如动态对象创建、模板类等,这个项目提供了一个良好的起点。

    (源码)基于C++的多态职工管理系统.zip

    本项目是一个基于C++编程语言的职工管理系统,主要用于学习和实践多态的概念。系统支持职工信息的增删改查、排序以及与文件的互通,适合初学者理解和掌握C++中的多态特性。 ## 项目的主要特性和功能 1. 多态实现 ...

    C++多态Demo

    在C++编程语言中,多态(Polymorphism)是一种重要的特性,它允许我们使用一个接口来表示多种不同的类型。这个“C++多态Demo”示例中,我们看到长方形和三角形作为形状(Shape)类的派生类,体现了面向对象编程中的...

    黑马程序员匠心之作 C++教程_第4阶段实战-基于多态的企业职工系统讲义.rar

    在C++中,多态(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性允许我们使用一个接口来表示多种类型的对象,它提供了一种灵活的方式来设计和实现代码,使程序更具可扩展性和可维护性。...

Global site tag (gtag.js) - Google Analytics