`
zsxxsz
  • 浏览: 451166 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++ 中如何设计 final 类

阅读更多

      在 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() {}
	};

}

 

 

      个人微博:http://weibo.com/zsxxsz

      acl_cpp 下载:http://sourceforge.net/projects/acl/

      github: https://github.com/acl-dev/acl

      更多文章:http://zsxxsz.iteye.com/

      QQ 群:242722074

 

分享到:
评论

相关推荐

    OOP final_C++大作业(棋类游戏设计)_

    在本项目中,"OOP final_C++大作业(棋类游戏设计)_"是一个基于C++编程语言的大型课程项目,旨在让学生应用面向对象编程(OOP)的概念来设计一个棋类游戏。这个项目不仅涵盖了基本的游戏逻辑,还涉及到了网络联机...

    大学C++《面向对象程序设计I》所有实验报告

    在大学的《面向对象程序设计I》课程中,C++是一种重要的编程语言,因为它支持面向对象编程(OOP)的概念,这些概念包括封装、继承和多态性。本实验报告集合旨在帮助学生深入理解并实践这些核心原则。下面将详细讨论...

    设计模式专题之(八)适配器模式---设计模式适配器模式示例代码(python--c++)

    如果`CPlusPlusClass`无法被继承(例如,它是final的或者没有虚函数),我们可以创建一个包含`CPlusPlusClass`实例的新类`CppAdapter`,并提供符合新接口的成员函数。这些函数内部调用`CPlusPlusClass`的方法,实现...

    04737 C++程序设计(刘振安2008).pdf

    深入理解c++11 pdf

    在传统的C++编程中,如果基类有多个构造函数,派生类为了能够正确初始化基类,通常需要为每个基类的构造函数提供对应的构造函数。这不仅增加了代码的冗余,也使得派生类的构造函数变得复杂。C++11引入了`using`声明...

    C++ MD5加密封装类

    - `cpp-md5`是一个专门为C++设计的小型库,专注于MD5算法,使用起来更加简洁。 3. **封装MD5类的设计**: - 类的结构通常包括私有成员变量,如存储MD5摘要的16字节数组,以及公开的成员函数,如计算MD5、设置和...

    C++程序设计原理与实践英文讲义之二

    《C++程序设计原理与实践》是C++之父Bjarne Stroustrup的重要著作,这份英文讲义是其最新力作的精华呈现。讲义以其深入浅出的方式,通过丰富的代码实例,帮助读者理解C++的核心概念和编程实践。以下是对每个文件名的...

    简单的C++类,MD5算法

    在C++编程环境中,实现MD5算法通常会涉及到类的设计和使用。以下将详细介绍C++中MD5类的设计思路以及相关知识点。 首先,`md5c.c`和`md5class.cpp`可能是包含MD5算法核心实现的源文件。`md5c.c`可能是一个简化的...

    c++类的编写习题集

    在C++编程中,类是面向对象编程的基础,它封装了数据和操作这些数据的方法,提供了模块化的编程方式。本习题集旨在帮助C++初学者巩固类的编写技巧,进一步理解和掌握面向对象编程的核心概念。 一、类的定义与成员 1...

    md5加解密c++md5加解密c++

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,由计算机科学家Ronald Rivest在1991年设计。它能够将任意长度的数据转换为固定长度的128位(16字节)的摘要,通常以32位的十六进制数表示。在C++中实现...

    关于Final的用法

    当`final`修饰基础数据类型(如int, double)的成员变量时,它等价于C/C++中的`const`关键字,意味着一旦初始化后,该成员变量的值就不能再被改变。例如,在`java.lang.Math`类中,`PI`和`E`常量就是被`final`修饰的...

    C++讲稿(清华大学 郑 莉ppt)

    C++通过虚函数和纯虚函数实现多态,这在设计模式和面向接口编程中尤其重要。此外,C++11引入了`override`和`final`关键字,以更精确地控制多态行为。 群体类和群体数据的组织则涉及到数据结构和算法。群体类可以是...

    C++语言参考文档官方中文版

    C++语言作为一门功能强大且复杂的编程语言,在程序设计、系统编程等领域有着广泛的应用。通过这份C++语言参考文档的概述,我们可以了解到C++语言的基础知识、语法结构、特性以及现代C++的发展情况。 首先,C++语言...

    web final project.zip_lexicalanalyzer_visual c++

    【标题】"web final project.zip_lexicalanalyzer_visual c++" 涉及的是一个使用Visual C++编写的词法分析器(lexical analyzer)的最终项目。词法分析器是编译器设计的一个重要组成部分,它负责将源代码分解成一...

    最近做的C++用ODBC连接SQL的课程设计

    在"Final Code"文件中,你将找到实现上述功能的完整C++代码。通过阅读和分析这些代码,你可以深入理解如何将C++、ODBC和SQL结合在一起,完成数据库操作。这个课程设计不仅可以帮助你提升C++编程技能,也能让你掌握...

    md5实现类,c++纯代码

    在C++中,实现MD5类时,你需要考虑以下设计要素: - **类结构**:定义一个名为`MD5`的类,其中包含四个成员变量A、B、C和D,以及可能的缓冲区数组。 - **方法**:包括`update`方法用于处理输入数据,`final`方法...

    C++奖学金评定系统课设报告.pdf

    总体来看,这个C++奖学金评定系统课设项目是面向对象程序设计的一个实际应用案例,它涵盖了类的设计、继承、封装和文件操作等核心概念,同时也体现了软件开发中的问题分析、功能实现和测试评估过程。对于学习C++和...

    C++简单类(构造函数,析构函数以及拷贝构造函数)的实现

    通过以上分析,我们可以看到,构造函数、析构函数以及拷贝构造函数在C++类的设计中扮演着关键角色。它们不仅负责对象的初始化和清理工作,还在对象间数据复制时确保了数据的正确性和安全性。掌握这些基本概念是深入...

    c++语言程序设计课后答案(清华大学郑莉)

    在C++中,**基类**是指被继承的类,而**派生类**是指继承了其他类特性的新类。例如: ```cpp class Base { public: void print() { cout ; } }; class Derived : public Base { public: void print() override { ...

Global site tag (gtag.js) - Google Analytics