C语言学习网

c/c++中的函数覆盖,虚函数,纯虚函数对比是什么样的

发表于:2022-12-07 作者:安全数据网编辑
编辑最后更新 2022年12月07日,c/c++中的函数覆盖,虚函数,纯虚函数对比是什么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.函数覆盖ClassA , C

c/c++中的函数覆盖,虚函数,纯虚函数对比是什么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1.函数覆盖

ClassA , ClassB ,其中ClassB继承ClassA

类定义如下:

#ifndef _CLASSA_H#define _CLASSA_H#include 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"<
#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"<

2.虚函数覆盖

VirtualClassA , VirtualClassB ,其中VirtualClassB继承VirtualClassA

类定义如下:

#ifndef _VIRTUAL_CLASS_A#define _VIRTUAL_CLASS_A#include 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"<
#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"<

3.纯虚函数覆盖

PureVirtualClassA , PureVirtualClassB ,其中PureVirtualClassB继承PureVirtualClassA

类定义如下:

#ifndef _PURE_VIRTUAL_CLASS_A#define _PURE_VIRTUAL_CLASS_A#include 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"<

测试代码如下:

// virtualMethodTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "ClassA.h"#include "ClassB.h"#include "VirtualClassA.h"#include "VirtualClassB.h"#include "PureVirtualClassA.h"#include "PureVirtualClassB.h"#include using namespace std;int _tmain(int argc, _TCHAR* argv[]){        cout<<"--------覆盖---------"<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<<"-------多态----------"<method();        delete(pVirtualClassA);        VirtualClassB *pVirtualClassB=new VirtualClassB();        pVirtualClassB->method();        delete(pVirtualClassB);        VirtualClassA *pVirtualClassB2=new VirtualClassB();        pVirtualClassB2->method();        delete(pVirtualClassB2);        cout<<"-------纯虚函数----------"<method();        //delete(pPureVirtualClassA);        PureVirtualClassB *pPureVirtualClassB=new PureVirtualClassB();        pPureVirtualClassB->method();        delete(pPureVirtualClassB);        PureVirtualClassA *pPureVirtualClassB2=new PureVirtualClassB();        pPureVirtualClassB2->method();        delete(pPureVirtualClassB2);        return 0;}

打印结果如下:

函数覆盖不能实现多态;

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

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

关于c/c++中的函数覆盖,虚函数,纯虚函数对比是什么样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0