zoukankan      html  css  js  c++  java
  • c/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




    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    SSH框架整合-myeclipse
    查看mysql数据库文件存放位置
    Java反射及注解学习- 反射的使用
    线程join方法demo-模拟叫号看病
    线程同步案例
    线程死锁示例
    《广西壮族自治区食品药品监督管理局》代码
    复习点算法知识,水仙花数加冒泡排序,以及一道算法题
    词性标注 HMM
    kd树
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4663988.html
Copyright © 2011-2022 走看看