制造抽象基类--《C++必知必会》 条款33

抽象类,含有纯虚函数的类,不可以创建对象。

然而,有时我们并不需要某个函数定义为纯虚函数,但是任然希望此类像抽象类一样,不可以创建对象。

方法1:通过确保类中不存在共有构造函数来模拟抽象基类的性质。意味着,我们必须至少显示地声明一个构造函数和一个复制构造函数,防止编译器隐式公有的内联的构造函数。声明为protected ,既允许派生类的构造函数使用他们,同时阻止创建对象。

class ABC{
protected:
        ABC();
        ABC(const ABC&);
};

方法2:让一个类成为抽象基类的方式需要人为的将一个虚函数制定为纯虚的。通常析构函数是最佳候选者。

class ABC{
protected:
       virtual ~ ABC()=0;
};

注意,在这个例子中,为该纯虚函数提供一个实现是必不可少的,因为派生类的析构函数将会隐式调用基类的析构函数(注意,从一个派生类析构函数内部对一个基类析构函数的隐式调用,总是非虚拟的)

方法3:采用受保护的、非虚拟的析构函数。当一个类没有任何虚函数并且不需要显示声明构造函数时使用。

class ABC{
protected:
       ~ ABC();
};
//...
 ABC * abc;//不会报错
 ABC * cba=new ABC; //不会报错

delete p;//错误!析构函数受保护的
//错误! 隐式调用abc的析构函数

原文地址:https://www.cnblogs.com/azbane/p/8610296.html

时间: 2024-10-10 07:04:49

制造抽象基类--《C++必知必会》 条款33的相关文章

C++必知必会(3)

条款26操作符函数查找 class X { public: Xoperator %( const X& ) const;             //二元取余操作 XmemFunc1( const X&); voidmemFunc2(); }; 可以采用中缀或函数调用语法来调用这个重载的操作符:如下 X a,b,c; a = b%c;        //采用中缀语法调用成员操作符% a = b.operator %(c);   //成员函数调用语法 a = b.memFunc1(c);  

《C++必知必会》学习笔记

转载:http://dsqiu.iteye.com/blog/1734640 条款一 数据抽象 抽象数据设计遵循步骤:(1)为类型取一个描述性的名字.(2)列出类型所能执行的操作,不要忘了初始化(构造函数),清理(析构函数),复制(复制操作)以及转换(不带explicit关键字修饰的但参数构造函数和转换操作符),而不是为数据成员提供一串get/set操作.(3)为类型设计接口.(4)实现类型,对抽象数据类型实现的改动,远比对其接口的改动要来得频繁. 条款二 多态 按照C++标准所言,“多态类型”

.NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)

Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一些列是使用.NET/C#来展现,但是同样适用于其他类似的OO技术平台,这些技术点可能称不上完整的技术,但是它是经验的总结,是掉过多少坑之后的觉醒,所以有必要花几分钟时间记住它,在真实的项目开发中你就知道是多么的有帮助.好了,废话不说了,进入主题. 我们在开发服务时为了调试方便会在本地进行一个基本的模块测试,你也可以认为是集

C++必知必会(2)

17.处理函数和数组声明 指向函数的指针声明与指向数组的指针声明很容易混淆,主要原因在于函数和数组修饰符的优先级比指针修饰符的优先级高,因此通常需要使用圆括号. int *f1();                            //一个返回值为int* 的函数 int (*fp1)();                 //一个指针,指向一个返回值为int的函数 const int N =12; int* a1[N];                  //一个具有N个int *元素的

C++必知必会(4)

条款35 placement new 直接调用构造函数是行不通的,然而可以通过使用placement new来哄骗编译器调用构造函数: void *operatornew(size_t, void* p) throw() { return p;} placement new是operator new的一个标准的重载版本,也位于全局名字空间中,但和我们通常看到的operator new不同,语言明令禁止用户替换placement new,而普通的operator new和operator dele

第4节:Java基础 - 必知必会(中)

第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象类中可以没有抽象方法,JDK8版本开始提供了接口总方法的default实现 抽象类和类一样是单继承的:接口可以实现多个父类 抽象类中可以存在普通的成员变量:接口中的变量必须是static final类型的,必须被初始化,接口中只能有常量,没有变量 解析: 在Java中,我们用abstract来定义抽

SQLServer:《SQL必知必会》一书的读书笔记(五)

第5课 高级数据过滤 5.1 组合 WHERE 子句 第4课介绍的 WHERE 子句在过滤数据时都是用单一的条件. 5.1.1 AND 操作符 检索由供应商 DLL01 制造且价格小于等于 4 美元的所有产品的名称和价格: SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4; 5.1.2 OR 操作符 检索任一个指定供应商制造的所有产品的名称和价格: SEL

mysql学习--mysql必知必会1

?? 例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式处理. (.)是正則表達式的一个符号,表示匹配随意一个字符: mysql> select prod_name -> from products -> where prod_name regexp '.000' -> order by prod_name; +--------------

《MySQL 必知必会》读书总结

这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. ? ? 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter password:****** 显示数据库 mysql>SHOW DATABASES; 选择数据库 mysql>USE mytest; 显示数据库中的表 mysql>SHOW TABLES; 显示表列 mysql>SHOW COLUMNS FROM tmall_user; mysql