c++面向对象高级编程 第五周学习笔记

ByteVoyant
• 阅读 1710

vptr&vtbl

对象在内存中存在一个虚函数指针,其一般存在于数据成员之前,虚函数指针指向虚函数表,在虚函数表中按照函数声明顺序存储着虚函数的地址。可以用(*(p->vptr)[n])(p);或者(*p->vptr[n])(p);访问。

动态绑定

当对象满足

  1. 使用指针调用
  2. 指针存在向上转型 UPcast
  3. 调用对象是一个虚函数

则编译器会在编译时进行动态绑定

对象模型&关于this

c++面向对象高级编程 第五周学习笔记

通过将需要子类实现的功能声明为virtual函数,使子类的this指针可以upcast 调用父类函数,内部使用不同子类的具体实现。

const

const成员函数
const可以修饰成员函数来避免成员函数对this指针的修改。
当成员函数的const和non-const版本都存在时,const成员只能调用const版本,
non-const成员只能调用non-const版本。

c++面向对象高级编程 第五周学习笔记

new&delete

我们可以对operator new和operator delete进行各种版本的重载,但是每个版本都需要有自己的独特参数序列
其中第一个参数必须是size_t.
对于operator delete的各种重载版本,它们虽然可以被重载,但是不会被delete调用,只有当new 调用的构造函数抛出异常时,它们才会被调用,用来清除申请失败对象的内存。
关于operator new和 operator delete的具体讨论见这次作业。operator new与 delete重载

当然我们也可以通过使用域作用符::来强制使用全局new和全局delete,调用方法是::new和::delete

点赞
收藏
评论区
推荐文章
cpp加油站 cpp加油站
4年前
c++头脑风暴-多态、虚继承、多重继承内存布局
本篇文章深入分析多态、虚继承、多重继承的内存布局以及实现原理。首先还是看一下思维导图:下面根据这个大纲一步一步的进行深入解析。一、没有虚函数时内存布局是怎样的1.没有虚函数时类的内存布局一个类没有虚函数的时候,其实就是结构体,它的内存布局就是按照成员变量的顺序来的。看如下代码:cppinclude<iostreamusingnamespaces
Wesley13 Wesley13
3年前
java实现多态中的虚函数相关概念
本文转载自参考博客1\.Java虚函数虚函数的存在是为了多态。C中普通成员函数加上virtual关键字就成为虚函数Java中其实没有虚函数的概念,它的普通函数就相当于C的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数PS:其实C和Java在虚函
小万哥 小万哥
2年前
C++虚函数详解:多态性实现原理及其在面向对象编程中的应用
在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C是一种面向对象的编程语言,在C中,虚函数是实现多态性的关键什么是虚函数虚函数是一个在基类中声明的函数,它可以被子类重写并提供不同的实现
Wesley13 Wesley13
3年前
C++中基类虚析构函数的作用及其原理分析
虚析构函数的理论前提是执行完子类的析构函数,那么父类的虚构函数必然会被执行。那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏。故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual。知识背景     
Stella981 Stella981
3年前
C++primer学习笔记(六)
1.virtual函数是基类希望派生类重新定义的函数,希望派生类继承的函数不能为虚函数。根类一般要定义虚析构函数。2.派生类只能通过派生类对象访问protected成员,不能用基类对象访问。基类定义为virtual就一直为虚函数,派生类写不写virtual都是虚函数。用做基类的类必须是已定义的。3.存在虚函数指针或引用
Wesley13 Wesley13
3年前
C++基类的析构函数定义为虚函数的原因
1:每个析构函数只会清理自己的成员(成员函数前没有virtual)。2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类的析构函数要定义为虚函数;基类指针可以指向派生类的对象(多态),如果删除该指针delete\\p,就会调用该指针指向的派生类的析构函数,而派生类
Wesley13 Wesley13
3年前
DLL如何导出类?
其实最好是写一个父类,把要实现的函数全部以虚函数的形式写在父类中,然后写一个子类,继承父类,重写父类的虚函数。这样的话就安全得多了。其次就在DLL中导出一个函数,返回父类的一个对象指针,再在EXE中动态链接DLL,调用导出函数。例子如下://以下是DLL的代码//class\_a.hclass A{public:
Stella981 Stella981
3年前
Boost Python官方样例(三)
导出C类(纯虚函数和虚函数)大致做法就是为class写一个warp,通过get\_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出warp类,但是类名使用class,析构函数不需要导出,因为它会被自动调用纯虚函数编写C函
Wesley13 Wesley13
3年前
C++之虚函数
<spanstyle"fontsize:18px;"include<iostreamusingnamespacestd;classAA{public:inta;//虚函数virtualvoidsay_
Wesley13 Wesley13
3年前
Oracle的使用笔记
1. 虚表dual     虚表是Oracle提供的用于操作函数的方式,属于sys用户,共享给所有用户使用。虚表dual是单行单列的表,表中存放一个常量数据X。     虚表的意义:更方便的操作函数或者查询常量。2\.函数      单行函数:表中的一列作为函数的参数,对于每一条记录,函数都有一个返回值。例如:u
Wesley13 Wesley13
3年前
C++进阶
///任何时候都不要在构造函数或析构函数中调用虚函数/classdog{public:stringm_name;