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

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

c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制的更多相关文章

  1. 虚函数&纯虚函数&抽象类&虚继承

    C++ 虚函数&纯虚函数&抽象类&接口&虚基类   1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过 ...

  2. C++基础 (7) 第七天 多态的原理 纯虚函数和抽象类 依赖倒置原则

    1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步 ...

  3. 【转】C++ 虚函数&纯虚函数&抽象类&接口&虚基类

    1. 动态多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型 ...

  4. C++ 虚函数&纯虚函数&抽象类&接口&虚基类(转)

    http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多 ...

  5. C++多态、虚函数、纯虚函数、抽象类

    多态 同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态. 两种多态: (1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数. (2)动态多态(简称多态) ...

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

    一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型 ...

  7. C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数

    1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并 ...

  8. C++开发系列-纯虚函数和抽象类

    概念 纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都实现该函数. 纯虚函数为各派生类提供了一个公共界面(接口的封装和设计.软件的模块功能的划分) 纯虚函数说明 ...

  9. cc32a_demo-32dk2j_cpp_纯虚函数与抽象类-txwtech

    //32dk2j_cpp_纯虚函数与抽象类cc32a_demo-txwtech//纯虚函数是用来继承用的//纯虚函数//抽象类-抽象数据类型//*任何包含一个或者多个纯虚函数的类都是抽象类//*不要/ ...

随机推荐

  1. java 加载dll介绍(转)

    最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows).刚刚把程序跑通,赶紧把一些心得写出来,mark.也希望对 ...

  2. android数据储存之应用安装位置

    原文地址:http://developer.android.com/guide/topics/data/install-location.html#Compatiblity 从API8開始,你能够将你 ...

  3. 10gocm-&gt;session5-&gt;数据库管理实验-&gt;GC资源管理器的资源消耗组介绍

    <GC资源管理器>  官方文件:administrator's Guide->24 Using the Database Resource Manager 用法:在实际生产环境中使用 ...

  4. 具体的例子来教你怎么做LoadRunner结果分析

    LoadRunner 解的地方--測试结果的分析.其余的录制和加压測试等设置对于我们来讲通过几次操作就能够轻松掌握了.针对 Results Analysis 我用图片加文字做了一个样例,希望通过样例能 ...

  5. 阿里2015在线研发project师笔试题(部分)

    今天lz去阿里的在线笔试打了一把酱油,因为lz的水平有限,时间太他么紧张了.以下把记下来的题给大家分享一下.选择题总共20道,前十题截了图,后面感觉太费时就没有再截了,凭记忆记下了两道.附加题都记录下 ...

  6. 基于AVR128单纯Modbus协议实施

    Modbus通信协议Modicon公司1979在发展中,适用于工业现场总线协议控制.Modbus通信系统包含芯片的节点,并与组合物可编程控制的公共传输线,它的目的是收集和监视多个节点的数据.Modbu ...

  7. Visual Studio 2015使用EF6的ModelFirst模式添加实体数据模型缺少tt文件问题

    在看实体框架 (EF) 入门的时候,当按照样例做到ModelFirst的时候出问题了 这是使用vs2015新建的实体数据模型 这是官网样例 对比样例截图,会发现里面缺少.tt的文件.最重要的是最终代码 ...

  8. linux如果不进入window磁盘

    最近,在windows8.1下安装ubuntu14.04,在windows沉睡.开放时间和进入选择进入系统选项,当时没有引起重视.他选择进入linux系统.但进入后,发现无法进入windows磁盘,百 ...

  9. eclipse android ndk 提示Type 'JNIEnv' could not be resolved 等信息解决办法

    新配置完eclipse c++ android ndk 环境后,导入项目提示以下信息 是由于没有将jni.h导入的缘故,而这个文件在ndk的目录下面.所以,参照以下步骤:Project Propert ...

  10. C++随机数的使用方法

         学过别的高级语言的都知道,产生随机数用的都是相似于random这种字符,c++也不例外,在C++中使用的是rand()函数,可是不同的是,假设在C++中仅仅使用了比如 "int i ...