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 ...
随机推荐
- 20165206 实验一 Java开发环境的熟悉
20165206 实验一 Java开发环境的熟悉 一.实验内容及步骤 实验一 Java开发环境的熟悉-1 建立有自己学号的实验目录. 通过vim Hello.java编辑代码. 编译.运行Hello. ...
- tensorflow实现RNN及Word2Vec
参考:<tensorflow实战> 首先介绍一下Word2Vec Word2Vec:从原始语料中学习字词空间向量的预测模型.主要分为CBOW(Continue Bags of Words) ...
- nodejs 环境安装
参考网站 http://www.runoob.com/nodejs/nodejs-http-server.html https://github.com/nodesource/distribution ...
- 美国主机BlueHost vs HostEase
网站备案对于大部分个人站长而言,花费成本高.程序复杂,因此在挑选主机时,常选择免备案IDC服务商,如美国.香港主机,且前几日国内某免备案机房因个别网站涉及非法言论而配合相关部门采取停网整顿等,为此站长 ...
- 解开一个疑惑,为什么LVS开放的端口,使用netstat或ss命令,不能查找到其监听的端口呢?
RT, 这个疑问,本周一直在心里,今天找到一个说法. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 另外LVS规则算是内核方法,用netstat -ntulp也显 ...
- 开始写博客,学习Linq
除了为处理数据提供全新的方法之外,LINQ还代表了一种朝着声明式以及函数式编程发展的转变. 当人们问我为什么要学习LINQ时,我会告诉他们LINQ可以处理XML.关系型数据以及内存中的集合,更会提到L ...
- Directory 类
Directory 类 该类公开,主要用于创建.移动和枚举通过目录和子目录的静态方法.此类不能被继承. 命名空间: System.IO; 程序集: mscorlib(在 msc ...
- nginx做代理安装docker
1.环境 服务器IP 服务用途 是否能 联网 192.168.126.128 docker服务器(简称B服务器) 不能 192.168.126.130 nginx服务器(简称A服务器) 能 2.背景 ...
- nginx反向代理uwsgi django服务器搭建总结
1.安装python.django.虚拟环境 参考帖子:安装python django https://blog.csdn.net/a249900679/article/details/5152720 ...
- centos的基本操作
1.ssh连接阿里云一段时间不操作自动断开打开/etc/ssh/sshd_config添加或修改: ClientAliveInterval 120ClientAliveCountMax 0 2.挂载数 ...