向上映射与向下映射

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

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

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

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

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

#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. 步步为营-87-imageAreaSelect插件使用(图片剪切)

    1 引用文件 jquery.imgareaselect.min.cs imgareaselect-default.js 2 代码 <%@ Page Language="C#" ...

  2. (转)HTTPS到底是个啥玩意儿?

    详细见:https://blog.csdn.net/zgwangbo/article/details/50889623 ,建立交互的过程见下图:

  3. 华硕X75VB安装ubuntu12.10网卡不可用等相关问题总结

    笔记本相关信息: 电脑型号:华硕X75VB 笔记本电脑 处理器:i5-3230M 2.60GHz 双核 主板:华硕X75VB (英特尔 Ivy Bridge - HM76 Express芯片组) 内存 ...

  4. 一脸懵逼学习Hadoop-HA机制(以及HA机制的配置文件,测试)

    1:能否让两个NameNode都正常影响客户端请求? 应该让两个NameNode节点在某个时间只能有一个节点正常影响客户端请求,相应请求的必须为Active状态的那一台. 2:standBy状态的节点 ...

  5. jquery中关于对象类型的判断原理

    class2type[ core_toString.call(obj) ] jquery中关于对象类型的判断原理 jquery源码中关于类型判断的工具函数为type,调用方法为$.type()或者jQ ...

  6. .NET Framework反射总结

    概述 程序集的反射以及动态的创建类对象,是自动化编程常用的到知识原理,比如插件编程.模板设计模式,都可以采用发射机制动态的去创建实例化对象,实现类的动态加载.这里简单总结下,常用到的Framework ...

  7. 【loj6029】「雅礼集训 2017 Day1」市场&&【uoj#228】基础数据结构练习题

    题解: 这两道题加上区间取min max应该算线段树几道比较不寻常的题目 其实也是挺好理解的 对于区间/d 显然在log次后就会等于0 而我们注意到如果区间中数都相等那么就可以一起除 也就是说每个区间 ...

  8. NEST 中的日期数学表达式

    Date math expressions Version: 5.x 英文原文地址:Date math expressions query/filter 中涉及到日期类型时(如:timeout 参数) ...

  9. Storm——Android SQLite数据库管理类库

    Storm是一个Android SQLite数据库管理类库,可以通过注解创建表和迁移数据库.它不是ORM框架.   特性: 1.通过@Annotations创建表: 2.通过@Annotations迁 ...

  10. sed命令实现文件内容替换总结案例

    sed -i "s@AAAAA@BBBBB@g" /home/local/payment-biz-service/env/test.txt sed -i "s#htxk. ...