前面讲到,派生类的构造函数和析构函数会自动调用基类的构造函数和析构函数,那么要让一个类不能被继承,那么就将它的构造函数和析构函数私有函数(派生类可以访问保护函数)。那么怎样才能得到该类的实例呢? 这倒不难,可以通过定义公有的静态函数来创建和释放类的实例,实现该类不能被继承但能被实例化的功能。

 #include"stdafx.h"
#include<iostream>
using namespace std; class Base
{
private:
Base(){};
~Base(){};
public:
int num;
static Base* Construct()
{
return new Base;
}
static Base* Construct(int n)
{
Base *p=new Base;
p->num=n;
cout<<"num is:"<<p->num<<endl;
return p;
}
static void Destruct(Base* instance)
{
delete instance;
instance=NULL;
}
}; int main()
{
Base *b1;
Base *b2=Base::Construct();
Base::Destruct(b2);
return ;
}

这样的类只能在上构建一个对象,却不能够在上构建。

最好的方法是使用虚继承:

 class Base;

 class Friend
{
private:
Friend(){};
7 ~Friend(){};
8 public:
friend Base;
}; class Base:virtual public Friend
{
public:
Base(){};
~Base(){};
};

理论上,若某一类Derived继承自Base,那么它需要自动调用Base的构造函数,而Base继承自Friend,那么先要调用Friend的构造函数,Base是Friend的友元类,所以Base能够访问Base的私有构造函数。但是这里,Friend是虚基类,Base虚继承自Friend,对于虚基类(Friend)的任何一个直接或间接派生类(Derived)的构造函数,它们的初始化都必须包含对该虚基类构造函数的直接调用,以初始化虚基类中的数据成员。所以这里,Derived需要直接调用Base的私有构造函数,显然是不被允许的,所以Derived不能继承Base。

小小的一题包含了很多的重要的知识!

参考:

1.用C++实现一个不能被继承的类http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/

2.关于构造单实例类的一个问题http://www.vckbase.com/index.php/wv/368

3.其他

[C++]不能被继承的类的更多相关文章

  1. C++实现不能被继承的类——终结类 分类: C/C++ 2015-04-06 14:48 64人阅读 评论(0) 收藏

    1.       问题 C++如何实现不能被继承的类,即终结类.Java中有final关键字修饰,C#中有sealed关键字修饰,而C++目前还没有类似的关键字来修饰类实现终结类,需编程人员手动实现. ...

  2. 32.C++不能被继承的类[C++ Final Class]

    [题目] 用C++设计一个不能被继承的类. [分析] 这是Adobe公司2007年校园招聘的最新笔试题.这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目. 在Java中定义了 ...

  3. 用C++设计一个不能被继承的类(用私有构造函数+友元函数)

    题目:用C++设计一个不能被继承的类. 分析:这是Adobe公司2007年校园招聘的最新笔试题.这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目. 在Java中定义了关键字f ...

  4. 用C++实现一个不能被继承的类

    #include<iostream> using namespace std; class Gradpa { friend class Parent;//声明public或者private ...

  5. C++设计实现一个不能被继承的类

    C++不同于Java,Java中被final关键字修饰的类不能被继承,C++能实现不被继承的类,但是需要自己实现. 为了使类不被继承,最好的办法是使子类不能构造父类的部分,此时子类就无法实例化整个子类 ...

  6. (剑指Offer)面试题48:不能被继承的类

    题目: 写一个不能被继承的类 思路: 1.把构造函数设为私有函数 在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的构造函数,要想一个类不能被继承,只要把它的构造函数和 ...

  7. 探讨C++实现一个不可被继承的类

    C#和Java都提供了一种机制让一个类不能被继承,如C#中的sealed关键字和Java的final关键字,然而C++程序员就没这么好命了.不过C++也可以模拟出这种效果,原理基于:子类的构造函数会自 ...

  8. 面试题48:用C++设计一个不能被继承的类

    解法一:把构造函数设为私有 将构造函数定义为私有,然后通过定义公有的静态函数来创建和释放类的实例. { public: static SealedClass1* GetInstance() { ret ...

  9. 用C++设计一个不能被继承的类(转)

    在Java 中定义了关键字final,被final修饰的类不能被继承. 首先想到的是在C++中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数.要想一个类不能被 ...

随机推荐

  1. MIFARE系列8《D8M1.exe》

    软件名:D8M1.exe 更新时间:2014.06.28 操作系统:windowAll 外部设备:D8读卡器 D8M1可以对MIFARE块读写操作,支持1K,4K.检验KEY后返回SAK,QTAQ,U ...

  2. Object-c 语法 - 头文件引用(@class/#import/#include)

    一. Objective-C 中 #import 和 #include 的区别 预编译指令 Objective-C:#import:由gcc编译器支持 C,C++:#include 在 Objecti ...

  3. WordPress实现长篇文章/日志/单页面分页功能效果

    在WordPress里写文章,如果内容很多,你可能想要把文章分成几页来让访客浏览,这样既保持了网页的美观,也提高了网页的打开速度.但是在WordPress默认提供的按钮里,你可能找不到文章分页功能所对 ...

  4. [转]How do I use software from a PPA

    [转]How do I use software from a PPA? https://launchpad.net/~mc3man/+archive/ubuntu/trusty-media To s ...

  5. graphicsMagick 文档

    ImageMagick资料 ---------------------------------------------------------------------------- ImageMagi ...

  6. NET Core中使用Redis

    NET Core中使用Redis 注:本文提到的代码示例下载地址> https://code.msdn.microsoft.com/How-to-use-Redis-in-ASPNET-0d82 ...

  7. c++ goto的使用

    c++ goto 语句的使用 1.定义一个类似标签的东西lable 2.使用goto关键字,跳转到lable, goto lable #include <iostream> #includ ...

  8. python代码风格指南:pep8 中文翻译

    摘要 本文给出主Python版本标准库的编码约定.CPython的C代码风格参见​PEP7.本文和​PEP 257 文档字符串标准改编自Guido最初的<Python Style Guide&g ...

  9. NEST.net Client For Elasticsearch简单应用

    NEST.net Client For Elasticsearch简单应用 由于最近的一个项目中的搜索部分要用到 Elasticsearch 来实现搜索功能,苦于英文差及该方面的系统性资料不好找,在实 ...

  10. Codeforces Round #109 (Div. 2) E. Double Profiles hash

    题目链接: http://codeforces.com/problemset/problem/155/E E. Double Profiles time limit per test 3 second ...