c++ 基础(七) 函数覆盖,虚函数,纯虚函数对比

1.函数覆盖

ClassA , ClassB ,其中ClassB继承ClassA

类定义如下:

#ifndef _CLASSA_H
#define _CLASSA_H

#include <iostream>
using namespace std;

class ClassA
{
	public:
		ClassA(void);
		~ClassA(void);
		void method();
};

#endif
#include "stdafx.h"
#include "ClassA.h"

ClassA::ClassA(void)
{
}

ClassA::~ClassA(void)
{
}

void ClassA::method(void)
{
	cout<<"I am from class ClassA: methodA"<<endl;
}
#ifndef _CLASS_B
#define _CLASS_B

#include "ClassA.h"

class ClassB:public ClassA
{
public:

	ClassB(void);
	~ClassB(void);
	void method();

};

#endif
#include "stdafx.h"
#include "ClassB.h"

ClassB::ClassB(void)
{

}

ClassB::~ClassB(void)
{

}

void ClassB::method()
{
	cout<<"I am from class ClassB: methodA"<<endl;
}

2.虚函数覆盖

VirtualClassA , VirtualClassB ,其中VirtualClassB继承VirtualClassA

类定义如下:

#ifndef _VIRTUAL_CLASS_A
#define _VIRTUAL_CLASS_A

#include <iostream>
using namespace std;
class VirtualClassA
{
public:
	VirtualClassA(void);
	~VirtualClassA(void);
	virtual void method();
};

#endif
#include "stdafx.h"
#include "VirtualClassA.h"

VirtualClassA::VirtualClassA(void)
{
}

VirtualClassA::~VirtualClassA(void)
{
}

void VirtualClassA::method()
{
	cout<<"I am from class VirtualClassA: method"<<endl;
}
#ifndef _VIRTUAL_CLASS_B
#define _VIRTUAL_CLASS_B

#include "VirtualClassA.h"

class VirtualClassB:public VirtualClassA
{
public:
	VirtualClassB(void);
	~VirtualClassB(void);
	 virtual void method( );
};

#endif
#include "stdafx.h"
#include "VirtualClassB.h"

VirtualClassB::VirtualClassB(void)
{
}

VirtualClassB::~VirtualClassB(void)
{
}

void  VirtualClassB::method()
{
	cout<<"I am from class VirtualClassB: method"<<endl;
}

3.纯虚函数覆盖

PureVirtualClassA , PureVirtualClassB ,其中PureVirtualClassB继承PureVirtualClassA

类定义如下:

#ifndef _PURE_VIRTUAL_CLASS_A
#define _PURE_VIRTUAL_CLASS_A

#include <iostream>
using namespace std;
class PureVirtualClassA
{
public:
	PureVirtualClassA(void);
	~PureVirtualClassA(void);
	virtual void method() =0;

	/*
		通常,不实现抽象基类的纯虚函数;
		当然,也可以给纯虚函数提供实现;
	*/
};

#endif
#include "stdafx.h"
#include "PureVirtualClassA.h"

PureVirtualClassA::PureVirtualClassA(void)
{
}

PureVirtualClassA::~PureVirtualClassA(void)
{
}
#ifndef _PURE_VIRTUAL_CLASS_B
#define _PURE_VIRTUAL_CLASS_B

#include "purevirtualclassa.h"
class PureVirtualClassB :public PureVirtualClassA
{
public:
	PureVirtualClassB(void);
	~PureVirtualClassB(void);
	 virtual void method();
};

#endif
#include "stdafx.h"
#include "PureVirtualClassB.h"

PureVirtualClassB::PureVirtualClassB(void)
{
}

PureVirtualClassB::~PureVirtualClassB(void)
{
}

void PureVirtualClassB::method(void)
{
	cout<<"I am from class PureVirtualClassB: method"<<endl;
}

测试代码如下:

// virtualMethodTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include "ClassA.h"
#include "ClassB.h"

#include "VirtualClassA.h"
#include "VirtualClassB.h"

#include "PureVirtualClassA.h"
#include "PureVirtualClassB.h"

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"--------覆盖---------"<<endl;
	ClassA *pClassA=new ClassA();
	pClassA->method();
	delete(pClassA);

	ClassB *pClassB=new ClassB();
	pClassB->method();
	//	pClassB->ClassA::method();--可以隐式调用父类的方法
	// (*pClassB).ClassA::method();
	delete(pClassB);

	ClassA *pClassB2=new ClassB();
	pClassB2->method();
	delete(pClassB2);

	cout<<"-------多态----------"<<endl;
	VirtualClassA *pVirtualClassA=new VirtualClassA();
	pVirtualClassA->method();
	delete(pVirtualClassA);

	VirtualClassB *pVirtualClassB=new VirtualClassB();
	pVirtualClassB->method();
	delete(pVirtualClassB);

	VirtualClassA *pVirtualClassB2=new VirtualClassB();
	pVirtualClassB2->method();
	delete(pVirtualClassB2);

	cout<<"-------纯虚函数----------"<<endl;
	//PureVirtualClassA *pPureVirtualClassA=new PureVirtualClassA();
	//pPureVirtualClassA->method();
	//delete(pPureVirtualClassA);

	PureVirtualClassB *pPureVirtualClassB=new PureVirtualClassB();
	pPureVirtualClassB->method();
	delete(pPureVirtualClassB);

	PureVirtualClassA *pPureVirtualClassB2=new PureVirtualClassB();
	pPureVirtualClassB2->method();
	delete(pPureVirtualClassB2);

	return 0;
}

打印结果如下:

函数覆盖不能实现多态;

虚函数和纯虚函数可以实现多态;

含有纯虚函数的类不能实例化。

代码地址:http://download.csdn.net/detail/zz7zz7zz/8096231

时间: 2024-10-10 05:31:46

c++ 基础(七) 函数覆盖,虚函数,纯虚函数对比的相关文章

虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数-&gt;抽象类,基类虚析构函数使释放对象更彻底

为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) 1 #include<iostream> 2 using namespace std; 3 4 class base{ 5 public: 6 /*virtual*/ void who(){ //define this function to virtual will be normal 7 cout << "this is th

C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构

一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型,我们如果想通过一个父类指针调用父类.子类中的同名函数的话,这个函数是有要求的: 在父类中,eat函数声明之前必须要加virtual声明eat()函数为虚函数. 一旦某个函数被声明为虚函数,那么所有派生类(子类)中eat()函数都是虚函数. 为了避免你在子类中写错虚函数,在C++11中,你可以在函数

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

静态成员函数与pthread_create,纯虚函数匹配使用实例

最近在浏览朋友写的代码,发现有一个细节非常值得学习,在这里将代码贴出来简单分享一下: #ifndef THREAD_H_ #define THREAD_H_ #include <pthread.h> #include <stdexcept> #include "Copyable.h" /* * 这个线程类是个抽象类,希望派生类去改写它 */ class Thread : public Copyable{ public: Thread(); virtual ~Th

c++虚函数,纯虚函数,抽象类,覆盖,重载,隐藏

C++虚函数表解析(转) ——写的真不错,忍不住转了  http://blog.csdn.net/hairetz/article/details/4137000 浅谈C++多态性  http://blog.csdn.net/hackbuteer1/article/details/7475622 C++抽象类  http://www.cnblogs.com/dongsheng/p/3343939.html C++的精髓——虚函数  http://blog.chinaunix.net/uid-268

C++ 虚函数与纯虚函数 浅析

[摘要] 本文首先简述虚函数与纯虚函数的定义,然后分析比较两者的区别与联系(DWS). [正文] 1)虚函数与纯虚函数有什么区别? 虚函数,不代表函数为不被实现的函数,为了允许用基类的指针来调用子类的这个函数:允许被其子类重新定义的成员函数. 纯虚函数,才代表函数没有被实现,为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数. 2)虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的.

C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义

首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略.纯虚函数则是一种特殊的虚函数.虚函数联系到多态,多态联系到继承. 一.虚函

转载:C++多态性 &amp; C++纯虚函数

C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言.我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握. 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念.多态(polymorphism),字面意思多种形状. C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写.(这里 我觉得要补充,重写的话可

虚函数、纯虚函数和接口的实用方法和意义

从理论上来说,这三个概念很容易背的滚瓜烂熟,但是从大学毕业到现在,我都没真正搞明白这三个东西的出现,究竟是为了做到什么事情. 也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正函数重载本质也就是入栈了两个不同的函数. 知道后来我才慢慢了解,这些概念的出现,完全就不是为了编程的功能实现,而是编程的易用和扩展,准确的来说是方便再次开发而提出的一种标准而

C++ 虚函数 、纯虚函数、接口的实用方法和意义

也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正函数重载本质也就是入栈了两个不同的函数. 回过头来讲,让我了解标题这三个概念的实际用处,还是在于我这第四次重写毕业论文的代码,将它改写成面向对象的时候,才理解的.在面向对象设计的过程中, 类是从抽象逐渐具体起来的,父类可以是非常非常抽象的东西,而最终实例化的子类就非常具体了.在这个继承的过程中,不断