在 Java 等语言中有一个关键字:final,该关键字专门用于禁止类继承的功能,而在以往的C++中却没有此关键字(据说最新的 C++ 规范增加了此关键字,但还未普及),在 acl_cpp 库中通过模板方式设计了 final 类的功能,下面是一个例子:
#include "stdafx.h" #include <stdio.h> #include "final_tpl.hpp" // 类 CMyFinalClass 禁止被子类继承 class CMyFinalClass : public acl::final_tpl<CMyFinalClass> { public: CMyFinalClass(int n) : dummy_(n) {} ~CMyFinalClass() {} void Test() { printf("hello, I'm the final class\n"); } protected: private: int dummy_; }; class CMyClass //: CMyFinalClass, 如果 CMyClass 继承 CMyFinalClass 则编译器会报错 { public: CMyClass() {} ~CMyClass() {} }; int main(void) { CMyFinalClass m(1); m.Test(); printf(">>enter any key to exit ...\n"); getchar(); return 0; }
由上述例子可以看出,如果您希望自己设计的类为 final 类,则只需将自己的类继承模板类 acl::final_tpl 即可(Win32/Linux 通用);当然,还有其它方法实现禁止类继承的方式,但不如上述方法通用。
acl::final_tpl 模板类的源码如下:
#pragma once namespace acl { #ifdef WIN32 template<typename TDerive, typename TProvider> class final_tpl_base { friend TDerive; friend TProvider; private: final_tpl_base() {} ~final_tpl_base() {} }; #else template <typename T> class identity { public: typedef T me; }; template<typename TDerive, typename TProvider> class final_tpl_base { friend class identity<TDerive>::me; friend class identity<TProvider>::me; private: final_tpl_base() {} ~final_tpl_base() {} }; #endif /* * 提供禁止派生的功能,需要此功能的类可以从final_tpl派生, * 并将类名作为模板参数传递 * @example: * class my_final_class : public acl::final_tpl <my_final_class> * { * public: * my_final_class() {} * ~my_final_class() {} * } * 这样就保证了 my_final_class 是不能被继承的 */ template<typename TFinalClass> class final_tpl : virtual public final_tpl_base<TFinalClass, final_tpl<TFinalClass> > { public: final_tpl() {} ~final_tpl() {} }; }
acl_cpp 下载:http://sourceforge.net/projects/acl/
github: https://github.com/acl-dev/acl
QQ 群:242722074
相关推荐
在本项目中,"OOP final_C++大作业(棋类游戏设计)_"是一个基于C++编程语言的大型课程项目,旨在让学生应用面向对象编程(OOP)的概念来设计一个棋类游戏。这个项目不仅涵盖了基本的游戏逻辑,还涉及到了网络联机...
在大学的《面向对象程序设计I》课程中,C++是一种重要的编程语言,因为它支持面向对象编程(OOP)的概念,这些概念包括封装、继承和多态性。本实验报告集合旨在帮助学生深入理解并实践这些核心原则。下面将详细讨论...
如果`CPlusPlusClass`无法被继承(例如,它是final的或者没有虚函数),我们可以创建一个包含`CPlusPlusClass`实例的新类`CppAdapter`,并提供符合新接口的成员函数。这些函数内部调用`CPlusPlusClass`的方法,实现...
在传统的C++编程中,如果基类有多个构造函数,派生类为了能够正确初始化基类,通常需要为每个基类的构造函数提供对应的构造函数。这不仅增加了代码的冗余,也使得派生类的构造函数变得复杂。C++11引入了`using`声明...
- `cpp-md5`是一个专门为C++设计的小型库,专注于MD5算法,使用起来更加简洁。 3. **封装MD5类的设计**: - 类的结构通常包括私有成员变量,如存储MD5摘要的16字节数组,以及公开的成员函数,如计算MD5、设置和...
《C++程序设计原理与实践》是C++之父Bjarne Stroustrup的重要著作,这份英文讲义是其最新力作的精华呈现。讲义以其深入浅出的方式,通过丰富的代码实例,帮助读者理解C++的核心概念和编程实践。以下是对每个文件名的...
在C++编程环境中,实现MD5算法通常会涉及到类的设计和使用。以下将详细介绍C++中MD5类的设计思路以及相关知识点。 首先,`md5c.c`和`md5class.cpp`可能是包含MD5算法核心实现的源文件。`md5c.c`可能是一个简化的...
在C++编程中,类是面向对象编程的基础,它封装了数据和操作这些数据的方法,提供了模块化的编程方式。本习题集旨在帮助C++初学者巩固类的编写技巧,进一步理解和掌握面向对象编程的核心概念。 一、类的定义与成员 1...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,由计算机科学家Ronald Rivest在1991年设计。它能够将任意长度的数据转换为固定长度的128位(16字节)的摘要,通常以32位的十六进制数表示。在C++中实现...
当`final`修饰基础数据类型(如int, double)的成员变量时,它等价于C/C++中的`const`关键字,意味着一旦初始化后,该成员变量的值就不能再被改变。例如,在`java.lang.Math`类中,`PI`和`E`常量就是被`final`修饰的...
C++通过虚函数和纯虚函数实现多态,这在设计模式和面向接口编程中尤其重要。此外,C++11引入了`override`和`final`关键字,以更精确地控制多态行为。 群体类和群体数据的组织则涉及到数据结构和算法。群体类可以是...
C++语言作为一门功能强大且复杂的编程语言,在程序设计、系统编程等领域有着广泛的应用。通过这份C++语言参考文档的概述,我们可以了解到C++语言的基础知识、语法结构、特性以及现代C++的发展情况。 首先,C++语言...
【标题】"web final project.zip_lexicalanalyzer_visual c++" 涉及的是一个使用Visual C++编写的词法分析器(lexical analyzer)的最终项目。词法分析器是编译器设计的一个重要组成部分,它负责将源代码分解成一...
在"Final Code"文件中,你将找到实现上述功能的完整C++代码。通过阅读和分析这些代码,你可以深入理解如何将C++、ODBC和SQL结合在一起,完成数据库操作。这个课程设计不仅可以帮助你提升C++编程技能,也能让你掌握...
在C++中,实现MD5类时,你需要考虑以下设计要素: - **类结构**:定义一个名为`MD5`的类,其中包含四个成员变量A、B、C和D,以及可能的缓冲区数组。 - **方法**:包括`update`方法用于处理输入数据,`final`方法...
总体来看,这个C++奖学金评定系统课设项目是面向对象程序设计的一个实际应用案例,它涵盖了类的设计、继承、封装和文件操作等核心概念,同时也体现了软件开发中的问题分析、功能实现和测试评估过程。对于学习C++和...
通过以上分析,我们可以看到,构造函数、析构函数以及拷贝构造函数在C++类的设计中扮演着关键角色。它们不仅负责对象的初始化和清理工作,还在对象间数据复制时确保了数据的正确性和安全性。掌握这些基本概念是深入...