C++中设计一个类,使其不能继承
1.C++11中已经有了final关键字:它的作用是指定类的虚函数不能被该类的继承类覆盖(override),或者是指定一个类成为一个不能被继承的类(final class)
2.派生类用调用基类的构造函数来初始化基类部分,若将基类构造函数声明为private,则实例化派生类成员时链接出错,但是这样基类也不能实例化,编译出错
3.将一个类的构造函数声明为private,则该类及其子类都不能实例化,但是若把子类声明为该类的友元,则该子类可以调用基类的private成员函数,也就是说此时子类可以实例化,而且这时候子类的子类也可以初始化,因为子类的子类初始化基类部分是调用子类的构造函数,而子类是可以正常初始化的,所以想到虚继承,子类虚继承自父类,子类的子类正常继承自子类,此时子类和子类的子类共用一个指针,该指针指向基类部分。
vitural base class 会在mosted derived class 中先被调用,然后在处于中间层的base class中抑制vitural base class的constructor,以保证virtual base class共享一份。如果少了virtual继承则是递归的调用constructor,就不能实现final的功能啦。<=最底层的派生类中会先调用virtual base class中构造函数,而不是递归调用直接基类的构造函数
class A
{
private:
A(){} friend class B;
}; class B : virtual A
{
}; class C : public B
{
}; void main()
{
B b;//ok
C c;//false
}
4.构造和析构任何一个设为私有都可以,然后提供一个或两个公有静态方法创建和销毁(只能在堆上创建对象)
class single
{
public:
static single* create()
{
return new single;
}
static void release(single *p)
{
delete p;
}
private:
single(){}
~single(){}
}; int main()
{
single *s = single::create();
single::release(s);
system("pause");
}
C++中设计一个类,使其不能继承的更多相关文章
- Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...
- java中关于类的封装与继承,this、super关键字的使用
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5454849.html. this关键字: this代表当前对象,它有以下几种用途: 1.本类 ...
- Java类与类的关系、继承与多态、重写与重载
Java类与类的关系 (1)is-a包括了 继承,实现关系 (2)has-a包括了 关联,聚合,组合关系 (3)use-a包括了 依赖关系 实现关系: 实现指的是一个class类实现interface ...
- 为什么java中只允许继承一个类?
一个类只能继承一个其他的类 在Java语言中禁止多重继承:一个类可以具有多个直接父类.多重继承不合法的原因是容易引发意义不明确.例如,有一个类C,如果允许它同时继承A类与B类(class C ex ...
- Pycharm 查看一个类的继承关系图
Pycharm 查看一个类的继承关系图 在我们开发过程中: 无论是使用的开发框架自带的类, 还是我们自定义的类都特别多; 并且类之间单继承和多继承频繁使用, 这个继承,不仅仅是一级的继承关系,包括好几 ...
- java一个类 继承HttpServlet 和实现Servlet区别
java一个类 继承HttpServlet 和实现Servlet区别 servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法 而HttpServlet实现了servlet接 ...
- IntelliJ IDEA 中如何查看一个类的所有继承关系(当前类的所有继承关系图)
IntelliJ IDEA 中如何查看一个类的所有继承关系(当前类的所有继承关系图) .embody{ padding:10px 10px 10px; margin:0 -20px; border-b ...
- 【问题】多重继承时,super函数只初始化继承的第一个类,不初始化第二个类。
class A(object): def __init__(self): print("init class A") class B(object): def __init__(s ...
- C++ //多继承语法 C++中允许一个类继承多个类
1 //多继承语法 C++中允许一个类继承多个类 2 #include <iostream> 3 #include <string> 4 using namespace std ...
随机推荐
- 289 Game of Life 生命的游戏
假设有一个大小为m*n的板子,有m行,n列个细胞.每个细胞有一个初始的状态,死亡或者存活.每个细胞和它的邻居(垂直,水平以及对角线).互动规则如下:1.当前细胞存活时,周围低于2个存活细胞时,该细胞死 ...
- 基本的查询流【MSSQL】
4个DML(Data Manipulation Language)命令 SELECT INSERT UPDATE DELETE 查询语法有一个特有的固定顺序 SELECT - FROM - WHERE ...
- sql 所有数据表中 插入字段
declare @tablename varchar(200)declare @sql varchar(2000)declare cur_t cursor forselect name from sy ...
- LN : leetcode 538 Convert BST to Greater Tree
lc 538 Convert BST to Greater Tree 538 Convert BST to Greater Tree Given a Binary Search Tree (BST), ...
- Android屏幕尺寸与度量单位(px,dp,sp)简介
MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
- NoSQL与关系数据库
关系型数据库:完全支持关系代数理论作为基础:有较大的数据规模:固定的数据库模式:查询效率快:强一致性:数据完整性较易实现:扩展性一般:可用性好. NoSQL:部分支持关系代数理论作为基础:有超大数据规 ...
- js中取整数的方法
1.取整的方法 Math.floor( ) Math 对象的方法--取比当前数值小的最大整数(下取整). Math.ceil( ) Math对象的方法--取比当前数值大的最小整数(上取整). Math ...
- CNN:测试一下YoloV3
项目地址:https://pjreddie.com/darknet/yolo/ mAP提升了不少,在VS上试一把 V3 的权值: https://pjreddie.com/media/files/yo ...
- ThinkPHP---thinkphp视图(V)
配置文件分3类:系统配置文件,分组配置文件,应用配置文件 ①系统配置文件ThinkPHP/Conf/convention.php: ②分组 / 模块 /平台配置文件Home/Conf/config.p ...
- HDU多校Round 8
Solved:2 rank:141 D. Parentheses Matrix n,m有一个小于6的时候是一种构造方法 答案是n + (m - 2) / 2 (n > m) 都大于6的时候 可以 ...