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

来源:互联网 发布:dns解析域名到端口号 编辑:程序博客网 时间:2024/05/17 08:44

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




0 0
原创粉丝点击