方法一:

#include <iostream>

using namespace std;

class A
{
public:
static A* getInstance();
static void deleteInstance(A** ppA); private:
A() { cout << "construct A\n";}
~A() { cout << "destruct A\n"; }
}; A* A::getInstance()
{
return new A;
} void A::deleteInstance(A** ppA)
{
delete *ppA;
*ppA = nullptr;
} int main()
{
A* pA = A::getInstance();
A::deleteInstance(&pA);
cin.get();
}

  其实也就是把构造函数、析构函数private了,这样当想派生一个类时,派生类无法构造一个父类,所以就不行了。




方法二:

#include <iostream>

using namespace std;

template <typename T>
class A
{
friend T;
private:
A(int data) : m_data(data) { cout << "construct A. data: " << m_data << endl; }
~A() {} int m_data;
}; class B : virtual public A<B>
{
public:
B(int data) : A(data) { cout << "construct B\n"; }
~B() {}
}; int main(void)
{
B b();
cin.get();
}

  类B设置为类A的友元,这样类B作为A的子类就可以构造一个父类了。这时候类B可以正常使用,但是不能从类B派生一个子类,因为B虚继承A,如果想 class C : pulic B 的话,由于是虚继承,那么在C类的构造函数就得直接调用A类的构造函数,但是B是A的友元,C不是,所以无法直接调用A的构造函数,编译出错。这里C类必须直接调用A的构造函数的

  但是如果你把B类的声明改为 class B : public A<B> 的话,那么又可以从B类派生一个子类C了,因为不用虚继承的话,在C类的构造函数调用B类的构造函数,B类的构造函数再调用A类的(B是A的友元,即使A的构造函数是private也无妨)。这是一层层向上调用的。

参考:

http://see.xidian.edu.cn/cpp/biancheng/view/238.html (写得很好)

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++]不能被继承的类

    前面讲到,派生类的构造函数和析构函数会自动调用基类的构造函数和析构函数,那么要让一个类不能被继承,那么就将它的构造函数和析构函数私有函数(派生类可以访问保护函数).那么怎样才能得到该类的实例呢? 这倒 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. MySQL 调优基础:Linux内存管理 Linux文件系统 Linux 磁盘IO Linux网络

    http://www.cnblogs.com/digdeep/category/739915.html

  2. 高级进程间通信之UNIX域套接字

    UNIX域套接字用于在同一台机器上运行的进程之间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据:它们并不执行协议处理,不需要添加或删除网络报头,无 ...

  3. Creating Your Own Server: The Socket API, Part 1

    转:http://www.linuxforu.com/2011/08/creating-your-own-server-the-socket-api-part-1/ By Pankaj Tanwar  ...

  4. FMDB 二次封装工具类,让你快速学会封装,集成数据库

    来源:StrivEver 链接:http://www.jianshu.com/p/4c77aee0b41c 上个版本为了增加用户体验,部分页面集成了离线缓存数据功能,于是就在项目里使用了数据库管理离线 ...

  5. Burn the Linked Camp(bellman 差分约束系统)

    Burn the Linked Camp Time Limit: 2 Seconds      Memory Limit: 65536 KB It is well known that, in the ...

  6. 通过uiview动画来放大图片

    UIImage *image=[UIImage imageNamed:"]; UIImageView *imageView=[[UIImageView alloc]init]; imageV ...

  7. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

  8. DML 数据操纵语言

    1.INSERT(插入)语言结构 INSERT INTO table(表名)(要插入的列名) VALUES(要插入的具体值): table:要插入数据的表的表名 column[,column]:表中要 ...

  9. C#中Dictionary小记

    使用C#中Dictionary的一下细节小记: 一.Dictionary.Add(key,value) 与 Dictionary[key]=value的区别: 如果Dictionary中已经有了key ...

  10. Linux Bash Shell学习笔记

    参数扩展: 1.被名称引用的参数称作变量2.被数字引用的参数称作位置参数3.被特定符号引用的参数具有特殊的含义和用途,被称作Bash的特殊内部变量引用. 基本参数扩展:字符$会引导参数扩展.大括号是可 ...