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 ...
随机推荐
- Kafka~消费的有效期
消息的过期时间 我们在使用Kafka存储消息时,如果已经消费过了,再永久存储是一种资源的浪费,所有,kafka为我们提供了消息文件的过期策略,可以通过配置server.properies来实现# vi ...
- Canvas入门笔记-实现极简画笔
今天学习了Html5 Canvas入门,已经有大神写得很详细了http://www.cnblogs.com/tim-li/archive/2012/08/06/2580252.html#8 在学习过后 ...
- 认识 jQuery (第一笔 点出重点)
1.我们先来讨论一下 jQuery 是什么? 要认识jQuery(简写jQ)首先要知道JavaScript(简写 js),因为jq就是一堆js的函数,是普通的js,只不过jq应用广泛,形成了行业标准[ ...
- 专题十二:实现一个简单的FTP服务器
引言: 在本专题中将和大家分享如何自己实现一个简单的FTP服务器.在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传.下载文件),例如我们经常用到微软的SkyDriv ...
- poj1240 Pre-Post-erous!
思路: 根据前序序列和后序序列递归构造m叉树,确定每个节点的子节点数量.再用组合数公式累乘. 实现: #include <iostream> using namespace std; ][ ...
- php angular/think angular/php模版引擎
在thinphp5中发现一个好用的模版引擎—think-angular, 此模板引擎主要特点是 不需要额外的标签定义, 全部使用属性定义, 写好的模板文件在IDE格式化代码的时候很整洁, 因为套完的模 ...
- v形 加强版
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...
- [转帖]关于flask-login中各种API使用实例
原贴:http://www.cnblogs.com/alima/p/5796298.html 简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(I ...
- 00JavaScript
JavaScript JavaScript是由网景公司开发的一种跨平台面向对象(object-oriented)的网页脚本语言(Web Script Language)是目前流行的网页特效设计语言Ja ...
- C++STL快速入门学习
C++ STL中最基本以及最常用的类或容器无非就是以下几个: string vector set list map 下面就依次介绍一下它们,并给出一些最常见的使用方法,做到最快入门. string 首 ...