您的位置:首页 > 编程语言 > C语言/C++

c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制

2015-07-21 11:41 435 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: