- 浏览: 497110 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jkxydp:
算法运行的结果根本就不对。
BM算法. -
soarwindzhang:
感谢博主的分享,我今天看了您的UFSET非递归的路径压缩时感觉 ...
并查集 -
zhangning290:
楼主好像只考虑了坏字符规则,。没有考虑好后缀
BM算法. -
lsm0622:
文字描述有错误 误导新学者
求有向图的强连通分量(scc):Tarjan算法 -
knightchen:
博主,你太强了!这篇文章对我学习C++多线程很有帮助!谢谢
并发学习之一_windows下ZThread在CodeBlocks上的安装与配置
1,先搞清楚private inheritance的行为:
(1)如果class之间是私有继承的关系,编译器不会将一个派生类自动转化为基类.
(2)由基类继承而来的所有成员,在派生类中都会变成private.
2,私有继承:只有实现部分被继承,接口部分应略去.
因此,如果你让D私有继承B,那么你是想采用class B内的某些程序代码,而不是因为B和D的对象有任何概念关系存在.
3,回想一下,laying的意义也是这样.那么如何在laying和private inheritance之间取舍呢?
尽可能使用laying,必要时(当protected members或虚函数牵扯进来)才使用private inheritance.
4,模版的坏处:Stack<int>和Stack<double>编译器默认会把代码完全复制一份,造成代码膨胀.
5,可以借助泛型指针避免代码重用的做法.
泛型指针:class存放的是对象指针
6,laying实现泛型指针:
注:上述代码可能存在的隐患:
有人可能会误用GenericStack.
7,借组private inheritance可以给出更好的实现方案.
实例代码:
(1)如果class之间是私有继承的关系,编译器不会将一个派生类自动转化为基类.
(2)由基类继承而来的所有成员,在派生类中都会变成private.
2,私有继承:只有实现部分被继承,接口部分应略去.
因此,如果你让D私有继承B,那么你是想采用class B内的某些程序代码,而不是因为B和D的对象有任何概念关系存在.
3,回想一下,laying的意义也是这样.那么如何在laying和private inheritance之间取舍呢?
尽可能使用laying,必要时(当protected members或虚函数牵扯进来)才使用private inheritance.
4,模版的坏处:Stack<int>和Stack<double>编译器默认会把代码完全复制一份,造成代码膨胀.
5,可以借助泛型指针避免代码重用的做法.
泛型指针:class存放的是对象指针
6,laying实现泛型指针:
#include <iostream> using namespace std; //先定义一个泛型类 class GenericStack { public: GenericStack(); void push(void *t); void* pop(); void* top(); bool empty(); int size(); ~GenericStack(); private: struct StackNode { StackNode(void* t, StackNode *nextNode) : data(t),next(nextNode){} void* data; StackNode* next; }; StackNode* head; int cnt; GenericStack(const GenericStack&); GenericStack& operator=(const GenericStack&); }; GenericStack::GenericStack() : head(NULL),cnt(0) {} void GenericStack::push(void* t) { head = new StackNode(t, head); cnt++; } void* GenericStack::pop() { if (!empty()) { StackNode* tmp = head; head = head -> next; void* tmpData = tmp -> data; delete tmp; cnt--; return tmpData; } } void* GenericStack::top() { if (!empty()) return head -> data; } bool GenericStack::empty() { return head == NULL; } int GenericStack::size() { return cnt; } GenericStack::~GenericStack() { while (head) { StackNode* tmp = head; head = head -> next; delete tmp; } } //laying技术的使用 class IntStack { public: void push(int *t) { s.push(t); } int* pop() { return static_cast<int*>(s.pop()); } int* top() { return static_cast<int*>(s.top()); } bool empty() { return s.empty(); } int size() { return s.size(); } private: GenericStack s; }; class DoubleStack { public: void push(double *t) { s.push(t); } double* pop() { return static_cast<double*>(s.pop()); } double* top() { return static_cast<double*>(s.top()); } bool empty() { return s.empty(); } double size() { return s.size(); } private: GenericStack s; //这个成员是核心 }; int main() { IntStack myStack; int a = 20, b = 30, c = 40; myStack.push(&a); myStack.push(&b); myStack.push(&c); cout << *(myStack.pop()) <<endl; cout << myStack.size() <<endl; cout << *(myStack.top()) <<endl; DoubleStack myStack2; double da = 20.11, db = 30.22, dc = 40.33; myStack2.push(&da); myStack2.push(&db); myStack2.push(&dc); cout << *(myStack2.pop()) <<endl; cout << myStack2.size() <<endl; cout << *(myStack2.top()) <<endl; return 0; }
注:上述代码可能存在的隐患:
有人可能会误用GenericStack.
7,借组private inheritance可以给出更好的实现方案.
实例代码:
#include <iostream> using namespace std; //先定义一个泛型类 class GenericStack { protected: GenericStack(); //它的对象无法在外面产生 //因此可以防止有人直接访问GenericStack void push(void *t); void* pop(); void* top(); bool empty(); int size(); ~GenericStack(); private: struct StackNode { StackNode(void* t, StackNode *nextNode) : data(t),next(nextNode){} void* data; StackNode* next; }; StackNode* head; int cnt; GenericStack(const GenericStack&); GenericStack& operator=(const GenericStack&); }; GenericStack::GenericStack() : head(NULL),cnt(0) {} void GenericStack::push(void* t) { head = new StackNode(t, head); cnt++; } void* GenericStack::pop() { if (!empty()) { StackNode* tmp = head; head = head -> next; void* tmpData = tmp -> data; delete tmp; cnt--; return tmpData; } } void* GenericStack::top() { if (!empty()) return head -> data; } bool GenericStack::empty() { return head == NULL; } int GenericStack::size() { return cnt; } GenericStack::~GenericStack() { while (head) { StackNode* tmp = head; head = head -> next; delete tmp; } } //laying技术的使用 class IntStack : private GenericStack { public: void push(int *t) { GenericStack::push(t); } int* pop() { return static_cast<int*>(GenericStack::pop()); } int* top() { return static_cast<int*>(GenericStack::top()); } bool empty() { return GenericStack::empty(); } int size() { return GenericStack::size(); } }; class DoubleStack : private GenericStack { public: void push(double *t) { GenericStack::push(t); } double* pop() { return static_cast<double*>(GenericStack::pop()); } double* top() { return static_cast<double*>(GenericStack::top()); } bool empty() { return GenericStack::empty(); } double size() { return GenericStack::size(); } }; int main() { IntStack myStack; int a = 20, b = 30, c = 40; myStack.push(&a); myStack.push(&b); myStack.push(&c); cout << *(myStack.pop()) <<endl; cout << myStack.size() <<endl; cout << *(myStack.top()) <<endl; DoubleStack myStack2; double da = 20.11, db = 30.22, dc = 40.33; myStack2.push(&da); myStack2.push(&db); myStack2.push(&dc); cout << *(myStack2.pop()) <<endl; cout << myStack2.size() <<endl; cout << *(myStack2.top()) <<endl; return 0; }
发表评论
-
条款43:明智地使用多继承
2010-06-08 09:33 13361,多继承带来的一个根本性的复杂性:模棱两可. 例如: # ... -
条款44:说出你的意思并了解你所说的每一句话
2010-06-08 09:30 7741,彻底了解不同的面向对象架构在C++中的意义. 2,声明一 ... -
条款30:避免写出member function,传回一个non-const function或reference并指向private或protect成员
2010-06-08 09:29 11891,先看一个例子: class Address { ... } ... -
条款4:尽量使用C++风格的注释形式
2010-06-07 09:49 7131,抛弃"/*...*/",改用" ... -
条款39:避免在继承体系中做向下转型(downcast)动作
2010-06-01 10:37 14381,先看个例子: class Person { ... }; ... -
条款2:尽量以<iostream>取代<stdio.h>
2010-06-01 10:36 9761,scanf和printf的缺点:不具有型别安全(type- ... -
条款1:尽量以const和inline取代#define
2010-06-01 10:35 9181,意思就是"尽量以编译器(compiler)&qu ... -
条款41:区分inheritance和template
2010-05-29 17:50 6681,首先考虑一个问题: 型别T会影响class的行为吗? 如果 ... -
条款40:通过layering技术来模塑"有一个"(has-a)或"根据某物实现(is-implemented-in-terms-of)"
2010-05-29 17:48 7621,所谓laying,就是以一个class为本,建立另外一个c ... -
条款38:绝对不要重新定义继承而来的缺省参数值
2010-05-29 17:48 7851,首先可以安全的把问题讨论局限于"继承一个带有缺省 ... -
条款37:绝对不要重新定义继承而来的非虚拟函数
2010-05-29 17:47 7281,先看个例子: class B { public: vo ... -
条款36:区分接口继承和实现继承
2010-05-29 17:46 8451,public继承分为两类:接口继承和实现继承. 这两种继承 ... -
条款35:确定你的public继承,模塑出"isa"的关系
2010-05-29 17:46 9551,C++面向对象程序设计最重要的原则: public继承意味 ... -
条款29:避免传回内部数据的handles
2010-05-28 10:35 13481,考虑下面的代码: class string { oper ... -
条款28:尝试切割global namesapce
2010-05-28 10:34 6811,namesapce的使用 namespace std{ ... -
条款50:加强自己对C++的了解
2010-05-25 11:46 8731,只推荐两本书: (1)D&E: The Desig ... -
条款49:尽量让自己熟悉C++标准库
2010-05-25 11:46 7781,标准库的每一样东西几乎都在namespace std中,然 ... -
条款48:不要对编译器的警告视而不见
2010-05-25 11:45 7681,在你忽略一个警告之前,你必须精确了解编译器企图告诉你的是什 ... -
条款47:使用non-local static objects之前先确定它已有初值
2010-05-25 11:45 8281,当一个编译单元内某对象的初始化动作,与另一个编译单元内某对 ... -
条款26:防卫潜伏的ambiguity状态
2010-05-25 11:44 7251, class B; class A { public: ...
相关推荐
条款39:明智而审慎地使用private继承 use private inheritance judiciously. 条款40:明智而审慎地使用多重继承 use multiple inheritance judiciously. 7. 模板与泛型编程 templates and generic programming ...
内容简介: 有人说C++程序员可以分成两类,读...条款39:明智而审慎地使用private继承 条款40:明智而审慎地使用private继承 7.模板与泛型编程 8.定制new和delete 9.杂项讨论 A 本书之外 B 新旧版条款对映 索引
NULL 博文链接:https://copperfield.iteye.com/blog/1140058
软件设计课件:Lecture 08 CPP Inheritance.ppt
C++类的继承练习(Class inheritance exercise)
Type inheritance is that phenomenon according to which we can say, for example, that every square is also a rectangle, and so properties that apply to rectangles in general apply to squares in ...
使用纯 JavaScript 实现对象继承的简单而小巧的实现。 安装 去做 NPM: $ npm install --save inheritance-js Bower: $ bower install --save inheritance-js 下载: (最新) 特征 添加到使用ObjectDefinition....
条款14:明智运用 exception specifications 072 Use exception specifications judiciously 条款15:了解异常处理(exception handling)的成本 078 Understand the costs of exception handling 效率(Efficiency...
Between public and private inheritance? Between private inheritance and layering? Between function overloading and parameter defaulting? Between virtual and nonvirtual functions? Between pass-by-...
C程序设计教学课件:CHAPTER8INHERITANCE.pptx
C 程序设计教学课件:CHAPTER 8 INHERITANCE.ppt
C++程序设计教学课件:CHAPTER 8 INHERITANCE.ppt
面向对象程序设计英文教学课件:10-Inheritance.pptx
面向对象程序设计英文教学课件:10_Inheritance.ppt
资源分类:Python库 所属语言:Python 资源全名:eea.faceted.inheritance-4.5.zip 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
继承模拟 一种基于代理的模型,用于模拟英国人口,重点关注继承财富的影响。 要求 Python 3.6 requirements.txt列出的软件包 运行模拟 在第一次运行之前,请初始化数据: make data 或者 python data.py 要运行...
执照(麻省理工学院执照) 版权所有(c)2009 Gewalli <gewalli> 特此免费授予获得此软件和相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用,复制,修改,合并的权利,发布,分发,...
大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)