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 ...
随机推荐
- PV-UV-QPS
QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...
- exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
1.虽然,不是大错,还说要贴一下,由于我运行run-example streaming.NetworkWordCount localhost 9999的测试案例,出现的错误,第一感觉就是Spark没有 ...
- 一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)
Storm的官方网址:http://storm.apache.org/index.html :集群部署的基本流程(基本套路): 集群部署的流程:下载安装包.解压安装包.修改配置文件.分发安装包.启动集 ...
- Java数据结构与算法结构图
- Python_dict部分功能介绍
字典是无序的 x.clear():清除所有元素 x.fromkeys():返回一个新的字典,使前面的key=value x.get():如果k不存在,默认返回一个值,如果存在,则返回存在的值 x.it ...
- Python学习(二十五)—— Python连接MySql数据库
转载自http://www.cnblogs.com/liwenzhou/p/8032238.html 一.Python3连接MySQL PyMySQL 是在 Python3.x 版本中用于连接 MyS ...
- git之二: git可视化工具sourcetree
参考: https://www.cnblogs.com/tian-xie/p/6264104.html sourcetree安装使用
- 大数据及Hadoop的概述
一.大数据存储和计算的各种框架即工具 1.存储:HDFS:分布式文件系统 Hbase:分布式数据库系统 Kafka:分布式消息缓存系统 2.计算:Mapreduce:离线计算框架 stor ...
- Booksort POJ - 3460 (IDA*)
Description The Leiden University Library has millions of books. When a student wants to borrow a ce ...
- Lunch War with the Donkey CSU - 2084
Jingze is a big figure in California State University for his stubbornness. Because of his new failu ...