向上映射与向下映射

派生类对象转换成基类对象,称为向上映射。

而基类对象转换成派生类对象,称为向下映射;

向上映射可由编译器自动完成,是一种隐式的自动类型转化;

凡是接受基类对象的地方(如函数参数)都可以使用派生类对象,编译器会自动将派生类

转化为基类对象以便使用;

#include <iostream>
using namespace std; class Base
{
public:
void print()
{
cout << "Base::print()" << endl;
}
}; class Derive :public Base
{
public:
void print()
{
cout << "Derive:print()" << endl;
}
}; void fun(Base obj)
{
obj.print();
} int main()
{
Derive d;
d.print();
fun(d);//Base::print()自动转化为基类的对象
return ;
}

虚函数

对于被派生类重写的成员函数,若它在基类中被声明为虚函数,则通过基类指针或者引用

调用该成员函数时,编译器将根据所指向对象的实际类型决定是调用基类中的函数还是派生类中重写的函数;

class Base

{

public:

  virtual 返回类型 函数名(形式参数);//虚函数

};

若某个成员函数在基类中声明为虚函数,当派生类重新写他时,无论是否声明为虚函数,

该成员函数都可以仍然是虚函数;

#include <iostream>
using namespace std; class Base
{
public:
virtual void print()
{
cout << "Base::print()" << endl;
}
}; class Derive : public Base
{
public:
void print()
{
cout << "Derive::print()" << endl;
}
}; void fun(Base& obj)
{
obj.print();//obj是Base类对象的引用
} int main()
{
Derive d;
d.print();
fun(d);
return ;
}
虚析构函数的使用例子:

#include <iostream>
using namespace std; class B
{
public:
virtual void show()
{
cout << "B.show()\n";
}
virtual ~B()
{
cout << "~B()\n";
}
}; class D : public B
{
public:
void show()
{
cout << "D.show()\n";
}
~D()
{
cout << "~D()\n";
}
}; void test(B* ptr)
{
ptr->show();
} int main()
{
B * ptr = new D;
test(ptr);
delete ptr;
}

禁止重写的虚函数

使用final关键字修饰的虚函数,派生类不可以对它进行重写,改变函数的定义或者行为;

在派生类的过程中,final可以在继承关系链的中途设置,禁止后续派生类对指定虚函数的重写;

class A

{

public:

  virtual void fun() = 0;

};

classB:public A

{

  public:

    void fun() final;//到此为止,后续的子类不可以再重新写此接口函数

};

class C:public B

{

  public:

    void fun();//无法通过编译

};

C++程序设计方法3:虚函数的更多相关文章

  1. C++虚方法(虚函数)随笔

    本文不讨论虚函数的原理,只简单总结下虚函数的常用事项. 虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(voi ...

  2. C++程序设计方法3:函数重写

    派生类对象包含从基类继承类的数据成员,他们构成了“基类子对象”基类中的私有成员,不允许在派生类成员函数中被访问,也不允许派生类的对象访问他们:真正体现基类私有,对派生类也不开放其权限:基类中的公有成员 ...

  3. C++程序设计方法2:函数运算符重载

    函数运算符()重载 函数运算符()也能重载,它使得对象看上去像是一个函数名 ReturnType operator() (Parameters) { ...... } ClassName Obj; O ...

  4. C++——多态性 与 虚函数

    多态性 多态性是面向对象程序设计的关键技术之一.若程序设计语言不支持多态性,不能称为面向对象的语言.利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能. 多态性(polymorphism) ...

  5. C++的虚函数

    1 多态产生的背景  希望同一个方法在派生类和基类中的行为是不同的,换句话来说,方法的行为取决于调用该方法的对象. 2 解决多态的两种方法  1)在派生类中重新定义基类的方法  2)使用虚方法 3 虚 ...

  6. c++ 多态,虚函数、重载函数、模版函数

    c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...

  7. C++学习笔记--从虚函数说开去

    虚函数与纯虚函数: 虚函数:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,virtual  函数返回类型  函数名(参数表){函数体;} ,实现多态性,通过指向派生类的基类 ...

  8. C++Review1_多态和虚函数

    继承是实现多态的基础.虚函数是实现多态的方法.虚函数.多态.继承都是紧密相关的概念.而继承是所有概念的基础: 多态:简单来讲就是接口一样,实现多样.多态是指通过基类的指针或者引用,在运行时动态调用实际 ...

  9. 【C/C++】概念: VC虚函数布局引发的问题

    在网上看到一个非常热的帖子,里面是这样的一个问题: 在打印的时候发现pFun的地址和 &(Base::f)的地址竟然不一样太奇怪了?经过一番深入研究,终于把这个问题弄明白了.下面就来一步步进行 ...

  10. Lua 支持虚函数的解决方案

    概述 lua本身没有提供类似C++虚函数机制,调用的父类方法调用虚函数可能会出现问题. 问题分析 分析这段代码和输出 local Gun = {} -- 示例,实际应用还要考虑构造,虚表等情况 fun ...

随机推荐

  1. 【转】Crosswalk入门

    原文:https://www.mobibrw.com/2015/1934 Crosswalk是一款开源的web引擎.目前Crosswalk正式支持的移动操作系统包括Android和Tizen,在And ...

  2. virtualenv and virtualenvwrapper

    virtualenv 1.下载virtualenv工具 通过物理环境的pip工具安装  清华 国内 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/ ...

  3. IDEA 创建Spring MVC项目搭建

    概述 IntelliJ IDEA是一款更加集成智能的开发工具,相对Myeclipse开发而言,使用起来相对更加的方便:初步手动使用IDEA搭建Spring MVC项目,现将操作流程整理记录如下. 环境 ...

  4. java抽象类详解

    前言 在没讲抽象类之前  我们先来看看 final关键字 final 修饰符 可以修饰 类.属性.方法 修饰类时  表示该类不能被继承   其他特征 跟普通的类一样 修饰 属性时 表示 改属性不能改变 ...

  5. 3. 深入研究 UCenter API 之 加密与解密(转载)

    1.  深入研究 UCenter API 之 开篇 (转载) 2.  深入研究 UCenter API 之 通讯原理(转载) 3.  深入研究 UCenter API 之 加密与解密(转载) 4.  ...

  6. Visio制图之垮职能流程图

    Visio制图中常用的一种就是带有不同职能,不同阶段的流程关系图. 下面是根据实际生产情况制作的一张“软件生产流程关系图”,供参考.

  7. seafile+glusterfs 安装部署

    今天在虚拟机上搭一下seafile,用于测试环境.此处安装的是社区免费版本的,可以使用一键自动安装(MySQL适用). 官方文档:https://manual-cn.seafile.com/ 1.一键 ...

  8. servlet生命周期和工作原理

    http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html

  9. scrapy 第一个案例(爬取腾讯招聘职位信息)

    import scrapy import json class TzcSpider(scrapy.Spider): # spider的名字,唯一 name = 'tzc' # 起始地址 start_u ...

  10. Spring中 PROPAGATION_REQUIRED 解释 事物是在一个方法里调用其他的方法,一起成功或者一起失败,是方法之间的关系,而不是某一个方法内部的问题。而且要以抛异常的方式来表明方法的失败,以此来导致事物起作用,大家全失败。

    事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 事务传播 ...