﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-且行且珍惜</title><link>http://www.cppblog.com/sunus/</link><description>书到用时方恨少非君子</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 20:58:29 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 20:58:29 GMT</pubDate><ttl>60</ttl><item><title>PHP</title><link>http://www.cppblog.com/sunus/archive/2007/01/22/17881.html</link><dc:creator>Sunus</dc:creator><author>Sunus</author><pubDate>Mon, 22 Jan 2007 01:12:00 GMT</pubDate><guid>http://www.cppblog.com/sunus/archive/2007/01/22/17881.html</guid><wfw:comment>http://www.cppblog.com/sunus/comments/17881.html</wfw:comment><comments>http://www.cppblog.com/sunus/archive/2007/01/22/17881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunus/comments/commentRss/17881.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunus/services/trackbacks/17881.html</trackback:ping><description><![CDATA[java-&gt;j2ee-&gt;servlet/jsp<br /><br />c#-&gt;.net-&gt;asp.net<br /><br />c/c++-&gt;php<br /><br />其实我觉得就网页本身的逻辑而言，面向对象不是必须的，php这样的过程性语言完全合适。但是对于分析需求、业务逻辑而言，OO的优势就很明显了，所以php4中引入、php5中基本完善的oo机制是符合发展趋势的。不过听说那帮大牛们并不是很关心phpoo的发展，仍是一竿子得钻研这个简单（简单得有点过）、高效的php，不知将来会是何种景观。<br /><br />就我而言，除了浅浅的看过python觉得相当好以外，php已是我认为的Web编程首选了。<img src ="http://www.cppblog.com/sunus/aggbug/17881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunus/" target="_blank">Sunus</a> 2007-01-22 09:12 <a href="http://www.cppblog.com/sunus/archive/2007/01/22/17881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>句柄类思想</title><link>http://www.cppblog.com/sunus/archive/2007/01/12/17571.html</link><dc:creator>Sunus</dc:creator><author>Sunus</author><pubDate>Fri, 12 Jan 2007 11:18:00 GMT</pubDate><guid>http://www.cppblog.com/sunus/archive/2007/01/12/17571.html</guid><wfw:comment>http://www.cppblog.com/sunus/comments/17571.html</wfw:comment><comments>http://www.cppblog.com/sunus/archive/2007/01/12/17571.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sunus/comments/commentRss/17571.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunus/services/trackbacks/17571.html</trackback:ping><description><![CDATA[   Thinking in c++ 第一版的中文翻译实在是无法忍，偏偏我就有这么一本（不知道哪儿来的：P）。幸好读到了一个从前没意识到的问题，也算是值了：句柄类，也叫Cheshire Cat。<br />   问题背景是这样的：1）在极为安全的领域，即使核心实现已经封闭在库中不可见，但是头文件中的变量定义仍然可能会曝露一些内部信息； 2）在设计初期，实现部分固然需要经常变动，连头文件中变量定义也需要经常变动，因此在重编译的时候头文件也需要编译，有时候导致编译时间过长。句柄类可以解决这类问题：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">:HANDLE.H -- Handle Classes</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#ifndef HANDLE_H_<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> HANDLE_H_</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_80_221_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_221_Open_Text.style.display='none'; Codehighlighter1_80_221_Closed_Image.style.display='inline'; Codehighlighter1_80_221_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_80_221_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_221_Closed_Text.style.display='none'; Codehighlighter1_80_221_Open_Image.style.display='inline'; Codehighlighter1_80_221_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> handle </span><span id="Codehighlighter1_80_221_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_80_221_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> cheshire; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Class declaration only</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">  cheshire</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> smile;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  handle( );</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  void doit( );<br />     ~handle( ); <br /></span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> HANDLE_H_</span></div>   这是所有客户程序员都能看到的，其中struct cheshire是没有完全指定的类型说明或类说明，将用来存放真正的变量。在这种技术中，包含具体实现的结构主体被隐藏在实现文件中。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">:HANDLE.CPP -- Handle implementation</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">handle.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Define handle's implementation</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_116_127_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_127_Open_Text.style.display='none'; Codehighlighter1_116_127_Closed_Image.style.display='inline'; Codehighlighter1_116_127_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_116_127_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_127_Closed_Text.style.display='none'; Codehighlighter1_116_127_Open_Image.style.display='inline'; Codehighlighter1_116_127_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"> handle:cheshire </span><span id="Codehighlighter1_116_127_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_116_127_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_148_209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_148_209_Open_Text.style.display='none'; Codehighlighter1_148_209_Closed_Image.style.display='inline'; Codehighlighter1_148_209_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_148_209_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_148_209_Closed_Text.style.display='none'; Codehighlighter1_148_209_Open_Image.style.display='inline'; Codehighlighter1_148_209_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />handle::handle() </span><span id="Codehighlighter1_148_209_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_148_209_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  smile</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(cheshire</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(cheshire));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  smile</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_232_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_232_258_Open_Text.style.display='none'; Codehighlighter1_232_258_Closed_Image.style.display='inline'; Codehighlighter1_232_258_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_232_258_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_232_258_Closed_Text.style.display='none'; Codehighlighter1_232_258_Open_Image.style.display='inline'; Codehighlighter1_232_258_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> handle::doit() </span><span id="Codehighlighter1_232_258_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_232_258_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">do something with i</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_279_296_Open_Image" onclick="this.style.display='none'; Codehighlighter1_279_296_Open_Text.style.display='none'; Codehighlighter1_279_296_Closed_Image.style.display='inline'; Codehighlighter1_279_296_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_279_296_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_279_296_Closed_Text.style.display='none'; Codehighlighter1_279_296_Open_Image.style.display='inline'; Codehighlighter1_279_296_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />handle::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">handle() </span><span id="Codehighlighter1_279_296_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_279_296_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  free(smile);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>   <br />   句柄类的使用就像任何类的使用一样，包括头文件，创建对象，发送信息。但是通过这样的设计，即隐藏了变量的设计，也使得实现作变动时无需重编译头文件。Bruce说虽然这并不是完美的信息隐蔽，但毕竟是一大进步。<img src ="http://www.cppblog.com/sunus/aggbug/17571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunus/" target="_blank">Sunus</a> 2007-01-12 19:18 <a href="http://www.cppblog.com/sunus/archive/2007/01/12/17571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C++中禁止类继承</title><link>http://www.cppblog.com/sunus/archive/2007/01/11/17532.html</link><dc:creator>Sunus</dc:creator><author>Sunus</author><pubDate>Thu, 11 Jan 2007 10:27:00 GMT</pubDate><guid>http://www.cppblog.com/sunus/archive/2007/01/11/17532.html</guid><wfw:comment>http://www.cppblog.com/sunus/comments/17532.html</wfw:comment><comments>http://www.cppblog.com/sunus/archive/2007/01/11/17532.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/sunus/comments/commentRss/17532.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunus/services/trackbacks/17532.html</trackback:ping><description><![CDATA[   在CoreJava 7 中提到C++中没有类似final的关键字，因此无法直接实现禁止类继承，但是 <a class="v1" href="http://www.informit.com/author_bio.asp/ISBN=0131482025" target="_new">Cay S. Horstmann</a>又说可以通过一些小技巧达到同样的效果，留作思考，但提示说用到虚基类。<br />   究竟是如何的“技巧”呢，很惭愧，虚基类忘得快没影了，于是Google大神之，摘录如下：<br /><br />   下面的代码将会禁止继承：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> A;<br /><img id="Codehighlighter1_20_57_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_57_Open_Text.style.display='none'; Codehighlighter1_20_57_Closed_Image.style.display='inline'; Codehighlighter1_20_57_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_20_57_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_57_Closed_Text.style.display='none'; Codehighlighter1_20_57_Open_Image.style.display='inline'; Codehighlighter1_20_57_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Lock </span><span id="Codehighlighter1_20_57_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_20_57_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />friend </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> A;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br /><img id="Codehighlighter1_54_55_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_55_Open_Text.style.display='none'; Codehighlighter1_54_55_Closed_Image.style.display='inline'; Codehighlighter1_54_55_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_54_55_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_55_Closed_Text.style.display='none'; Codehighlighter1_54_55_Open_Image.style.display='inline'; Codehighlighter1_54_55_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />Lock() </span><span id="Codehighlighter1_54_55_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_54_55_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_90_124_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_124_Open_Text.style.display='none'; Codehighlighter1_90_124_Closed_Image.style.display='inline'; Codehighlighter1_90_124_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_124_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_124_Closed_Text.style.display='none'; Codehighlighter1_90_124_Open_Image.style.display='inline'; Codehighlighter1_90_124_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> A : </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Lock </span><span id="Codehighlighter1_90_124_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_90_124_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img id="Codehighlighter1_110_111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_111_Open_Text.style.display='none'; Codehighlighter1_110_111_Closed_Image.style.display='inline'; Codehighlighter1_110_111_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_110_111_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_110_111_Closed_Text.style.display='none'; Codehighlighter1_110_111_Open_Image.style.display='inline'; Codehighlighter1_110_111_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />A()</span><span id="Codehighlighter1_110_111_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_110_111_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_121_122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_122_Open_Text.style.display='none'; Codehighlighter1_121_122_Closed_Image.style.display='inline'; Codehighlighter1_121_122_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_121_122_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_121_122_Closed_Text.style.display='none'; Codehighlighter1_121_122_Open_Image.style.display='inline'; Codehighlighter1_121_122_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />A(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> t)</span><span id="Codehighlighter1_121_122_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_121_122_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span></div>现在，如果你尝试从类A派生其它类将会得到类似下面这样的编译错误。 <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_18_19_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_19_Open_Text.style.display='none'; Codehighlighter1_18_19_Closed_Image.style.display='inline'; Codehighlighter1_18_19_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_18_19_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_19_Closed_Text.style.display='none'; Codehighlighter1_18_19_Open_Image.style.display='inline'; Codehighlighter1_18_19_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> B : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> A</span><span id="Codehighlighter1_18_19_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_18_19_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Lock::Lock' : cannot access private member declared in class 'Lock'<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>   这是因为派生类都需要调用虚基类的构造函数，因此从A派生的B需要调用虚基类的构造函数（也就是Lock的构造函数），而Lock的构造函数是私有的，类B又不是Lock的友元，所以这将会产生一个编译错误。 <br />   如果我们移除类A派生时的virtual关键字，程序将会成功编译。这是因为在非虚拟继承中，任何类都可以调用直接父类中的构造函数。因此，在非虚拟继承中，B将调用它的直接父类A的构造函数而A将调用它的直接父类Lock的构造函数，这都是合法的。<img src ="http://www.cppblog.com/sunus/aggbug/17532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunus/" target="_blank">Sunus</a> 2007-01-11 18:27 <a href="http://www.cppblog.com/sunus/archive/2007/01/11/17532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>