C++程序设计方法3:虚函数
向上映射与向下映射
派生类对象转换成基类对象,称为向上映射。
而基类对象转换成派生类对象,称为向下映射;
向上映射可由编译器自动完成,是一种隐式的自动类型转化;
凡是接受基类对象的地方(如函数参数)都可以使用派生类对象,编译器会自动将派生类
转化为基类对象以便使用;
#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:虚函数的更多相关文章
- C++虚方法(虚函数)随笔
本文不讨论虚函数的原理,只简单总结下虚函数的常用事项. 虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(voi ...
- C++程序设计方法3:函数重写
派生类对象包含从基类继承类的数据成员,他们构成了“基类子对象”基类中的私有成员,不允许在派生类成员函数中被访问,也不允许派生类的对象访问他们:真正体现基类私有,对派生类也不开放其权限:基类中的公有成员 ...
- C++程序设计方法2:函数运算符重载
函数运算符()重载 函数运算符()也能重载,它使得对象看上去像是一个函数名 ReturnType operator() (Parameters) { ...... } ClassName Obj; O ...
- C++——多态性 与 虚函数
多态性 多态性是面向对象程序设计的关键技术之一.若程序设计语言不支持多态性,不能称为面向对象的语言.利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能. 多态性(polymorphism) ...
- C++的虚函数
1 多态产生的背景 希望同一个方法在派生类和基类中的行为是不同的,换句话来说,方法的行为取决于调用该方法的对象. 2 解决多态的两种方法 1)在派生类中重新定义基类的方法 2)使用虚方法 3 虚 ...
- c++ 多态,虚函数、重载函数、模版函数
c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...
- C++学习笔记--从虚函数说开去
虚函数与纯虚函数: 虚函数:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,virtual 函数返回类型 函数名(参数表){函数体;} ,实现多态性,通过指向派生类的基类 ...
- C++Review1_多态和虚函数
继承是实现多态的基础.虚函数是实现多态的方法.虚函数.多态.继承都是紧密相关的概念.而继承是所有概念的基础: 多态:简单来讲就是接口一样,实现多样.多态是指通过基类的指针或者引用,在运行时动态调用实际 ...
- 【C/C++】概念: VC虚函数布局引发的问题
在网上看到一个非常热的帖子,里面是这样的一个问题: 在打印的时候发现pFun的地址和 &(Base::f)的地址竟然不一样太奇怪了?经过一番深入研究,终于把这个问题弄明白了.下面就来一步步进行 ...
- Lua 支持虚函数的解决方案
概述 lua本身没有提供类似C++虚函数机制,调用的父类方法调用虚函数可能会出现问题. 问题分析 分析这段代码和输出 local Gun = {} -- 示例,实际应用还要考虑构造,虚表等情况 fun ...
随机推荐
- OpenCV-Python入门教程1-图片
首先感觉学习OpenCV-python最好的学习工具官方的英文文档. 官方英文教程:OpenCV-Python Tutorials 我使用的是anaconda里的 jupyter notebook.至 ...
- python 0007
#coding='utf-8'# import re import os def get_list(): list_file=[] for f in os.listdir(): if f.endswi ...
- 5分钟了解swagger
5分钟了解swagger https://blog.csdn.net/i6448038/article/details/77622977 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变 ...
- PAT Basic 1065 单身狗
单身狗(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue "单身狗"是中文对于单身人士的 ...
- hadoop集群运行jps命令以后Datanode节点未启动的解决办法
出现该问题的原因:在第一次格式化dfs后,启动并使用了hadoop,后来又重新执行了格式化命令(hdfs namenode -format),这时namenode的clusterID会重新生成,而da ...
- 基于jquery的页面分屏切换模板
闲来无事,搞了个页面的分屏效果,先来看下效果: 出于可自定义宽高的目的,屏幕分块由CSS控制,由js控制估计等分模块效果一般. 程序相关说明: HTML结构: <div class=" ...
- 一起学Hive——使用MSCK命令修复Hive分区
最近在使用Hive的过程中,在备份数据时,经常会使用cp或mv命令来拷贝数据,将数据拷贝到我们新建备份表的目录下面,如果不是分区表,则上面的操作之后,新建的备份表可以正常使用,但是如果是分区表的,一般 ...
- 修改element ui 默认样式最好的解释
KedAyAyA 17年10月 https://forum.vuejs.org/t/elementui/19171/5 首先添加了scoped的style标签会在vue-loader里进行处理 所谓的 ...
- BZOJ4802 欧拉函数 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8117744.html 题目传送门 - BZOJ4802 题意概括 Description 已知N,求phi(N) ...
- 《第六周java学习笔记》
教材知识点总结 Java 把 String 类定义为 final 类. new 运算符首先分配内存空间并在内存空间中放入字符序列,然后计算出引用.(new String(char a[],int st ...