Cpp 对象模型探索 / 不能被继承的类
两种方法
- C++ 11 final 关键字
- 友元类 + 虚继承。
栗子
class A
{
private:A() {}friend class B;
};
class B : virtual public A
{
public:int m_b;
};
我们的目的是让 B 成为一个不能被继承的类。分析代码,由于 B 是 A 的友元,所以即使 A 的构造函数是私有的,B也是可以调用的,所以 B 继承 A 这个关系是成立的。
关键来了,由于 B 是虚继承 A,这就导致了如果 C 类想继承 B,则 C 类必须首先调用 A 类的构造函数(详情),而 A 类的构造函数是私有的,所以 C 类不能调用 A 类的构造函数,所以,B 类是不可继承的。
总结
使用时尽量使用方案 1,因为方案 2 是以牺牲性能、破坏类的封装性为代价的。
(SAW:Game Over!)
Cpp 对象模型探索 / 不能被继承的类相关推荐
- Cpp 对象模型探索 / 单一继承的类的内存布局
目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...
- Cpp 对象模型探索 / 含有虚基类的类的内存布局
一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...
- Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序
栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...
- Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...
- Cpp 对象模型探索 / 类静态成员函数的调用方式
一.普通静态成员函数的调用方法 栗子: class CA { public:static void func() {} };int main() {CA A;A.func();CA::func();r ...
- Cpp 对象模型探索 / 类普通成员函数的调用方式
C++设计时有一个要求,类普通成员函数的调用性能要和全局函数差不多.所以编译器在处理类的普通成员函数的宗旨是将其当作全局函数来处理. 为了达到上述目的,编译器会对类的普通成员函数进行如下操作: 在函数 ...
- Cpp 对象模型探索 / 类引入虚函数有哪些成本?
编译时会为类对象引入虚函数表. 类对象中会产生虚函数表指针 vptr,用于指向虚函数表. 在对象的构造函数中插入向 vptr 赋值虚函数表的首地址的代码. 若是多重继承,每个父类均有虚函数,那么子类会 ...
- Cpp 对象模型探索 / 虚基类表作用
一.结论 虚基类表的作用是帮助编译器找到该类中的虚基类中各个成员变量在内存布局中的位置. 虚基类表中的值是偏移值,即:各个虚基类的成员变量在子类中的内存布局中相对于虚函数指针的偏移值. 二.栗子 1. ...
- Cpp 对象模型探索 / 虚继承带虚函数的基类的子类的内存布局
源码 class Base { public:Base() {}virtual void func() {}int bi_; };class Son:virtual public Base { pub ...
最新文章
- 学习《Linux设备模型浅析之设备篇》笔记(三)
- Linux下redis安装部署
- python 库整理: collections.namedtuple
- 【Opencv实战】趣味应用 | 用OpenCV自动给图片添加虚拟特效---平淡的生活需要技术的点缀~
- 易语言神经网络验证码识别_递归神经网络 GRU+CTC+CNN 教会验证码识别
- 联想超融合平台oracle,联想AIO超融合云一体机解决方案.pdf
- 关于QQ非会员发图限制
- Python-Day2三级菜单
- Ubuntu16 e1000e驱动安装
- H5+App开发框架汇总
- 客户成功服务市场现状研究分析报告 -
- C#的get和set用法
- 常用的几种量化选股方法
- TypeError: Converting circular structure to JSON
- Node.js卸载与重装,zip与msi安装详解
- 如何在Linux终端中复制和粘贴文本、文件和文件夹。
- HomeBank-5.5.4-个人家庭记账分析软件(开源)
- labelImg的汉化与打包
- python canvas画弧度_「万圣节教程」不给糖就捣乱,用Python绘制有趣的万圣节南瓜怪...
- Blender+PS三维辅助CG场景概念设计学习教程