??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久青草青青国产亚洲免观,国产精品久久毛片完整版,A狠狠久久蜜臀婷色中文网http://m.shnenglu.com/ofan/::Just For Fun::zh-cnThu, 03 Jul 2025 05:33:54 GMTThu, 03 Jul 2025 05:33:54 GMT60常见逻辑谬误[转蝲]http://m.shnenglu.com/ofan/archive/2009/04/30/81555.htmlOxFANOxFANThu, 30 Apr 2009 05:02:00 GMThttp://m.shnenglu.com/ofan/archive/2009/04/30/81555.htmlhttp://m.shnenglu.com/ofan/comments/81555.htmlhttp://m.shnenglu.com/ofan/archive/2009/04/30/81555.html#Feedback0http://m.shnenglu.com/ofan/comments/commentRss/81555.htmlhttp://m.shnenglu.com/ofan/services/trackbacks/81555.html

[转自TopLanguages里的 一帖?/a>Qƈ非原译文Q《常见逻辑谬误》译文地址Q?a >http://www.yeeyan.com/articles/view/65452/28581]

当你与别论,试获得{案或解释时Q你可能会遇C些h犯上逻辑谬误。这L讨论是无意义的。你可能试向对手要求证据或提供其他假设Qo你获得更好或更简 单的解释。如果都p|Q可以尝试指Z讨论Ҏ(gu)的问题。你可L认他的逻辑问题以免qQ以及可告知讨论Ҏ(gu)x他的谬误。以下是单介l其中最常见的谬误: 

ndQad hominemQ: 
拉丁语「向着人」的意思。辩者用nd来攻d手,而不是在讨论议题。当辩者不能用证据、事实或理由ȝ护他的立场,他可能透过标签、稻草h、骂人、挑衅及?怒的nd方式来攻d手?#160;

诉诸无知Qappeal to ignorance / argumentum ex silentioQ: 
以诉诸无知作为某些证据。(例如Q我们没有证据说不存在Q所以祂一定存在。又例如Q由於我们没有关於外星h的知识,q表CZ们ƈ不存在。)Ҏ(gu)些东西的无知Q?是与它的存在与否无关?#160;

全知论据Qargument from omniscienceQ: 
Q例如:所有h都相信某些东西,每个人都知道的。) 
辩者需要有全知能力以清楚每个h的信仰、怀疑或他们的知识。小心如「所有」、「每个h」、「每U东ѝ、「绝寏V等词语?#160;

诉诸信心Qappeal to faithQ: 
Q例如:如果你不怿Q是不能清楚明白的。)如果辩者倚仗信心作ؓ他论据的根基Q那麽你在以後的讨论所能得到的不多。根据定义,「信心」是倚靠怿Qƈ非靠?辑或证据支持。信心倚赖非理性的思想Qƈ会生不妥协?#160;

诉诸传统Qappeal to traditionQ: 
Q类g思想谬误Q(例如Q占星、宗教、奴Ӟ只因Zh们以此ؓ传统Q与它本w的存活能力无关?#160;

诉诸权威Qargument from authority / argumentum ad verecundiamQ: 
以「专家」或权威的说话作论据的根基,而不是用逻辑或证据来支持该论据。(例如Q某某教授相信创造科学。)只由於某个权威的声称Q不以代表他已令这声称正确?假如辩者展C某专家的论据,那麽看看它有否伴随着原因Q以及它背後证据的来源?#160;

不良後果论据Qargument from adverse consequencesQ: 
Q例如:我们应判被告有罪Q否则其他h会仿效而犯上类似的|行。)只因厌的|行或行为出玎ͼq不以代表被告犯了该罪Q或代表我们应判他有|。(又例如:?隄出现是因为神惩罚不信者,所以我们都应该信神。)只因灑֮或惨剧发生,与神是否存在、或我们该信甚麽q无关系?#160;

恐吓论据Qargumentum ad baculumQ: 
论据根基於恐惧或威胁。(例如Q如果你不信,你将会下地狱被火烧。) 

无知论据Qargumentum ad ignorantiamQ: 
误导性的论据Q倚仗gh们的无知?#160;

众论据Qargumentum ad populumQ: 
论据诉诸感性的qQ而非事实和原因,旨在煽动众的支持?#160;

L思想谬误Qbandwagon fallacyQ: 
只因为很多h怿或实践,便认Z个思想有h(hun)倹{(例如Q大多数人相信神Q所以它一定是真的。)只因为很多h怿某些东西Q与那是事实与否q无关系。如很多人在 黑死病时期都怿疫症是由於魔鬼引P有多h怿跟疫症的起因全无关系?#160;

H取论点Qbegging the questionQ: 
Q例如:我们必须鼓励q青人去崇拜,以灌输道徯为。)可是宗教与崇拜真的生道徯为吗Q?#160;

循环Qcircular reasoningQ: 
陈述某命题,而其实那正是需要被证实的。(例如Q神存在是因为圣l有记蝲Q圣l存在是因ؓ所默示的。) 

构成谬误Qcomposition fallacyQ: 
当某论据的结论,是倚靠由某东西从部份至整体、或从整体至部䆾的错误特性。(例如QhcL意识Q而h体和都是由原子组成,所以原子都有意识。又例如Q文书处 理Y件由佷多原位l(byteQ组成,所以一个原位组是组成文书处理Y件的一部䆾。) 

认性偏见(confirmation biasQ: 
Q类似监视下的选择Q这是指一U选择性的思想Q集中於支持怿的h已相信的证据Q而忽略反驳他们信늚证据。确认性偏见常见於Z以信心、传l及成见为根据的?c例如,如果有些人相信祈L力量Q相信的人只会注意到量「有回应」的祷Q而忽略大多数无回应的祷。(q表C祈L价值最差只是随机,最好也只有心理?的安C用。) 

h相关及v因(confusion of correlation and causationQ: 
Q例如:玩象的人男性比x多Q所以男性棋Z比女性高。又例如Q儿童观看电(sh)视的暴力场面Q成长後会有暴力們֐。)但是Q那是由於电(sh)视节目引致暴力,q是有暴 力們֐的儿童喜Ƣ观看暴力节目?真正引致暴力的原因可能是完全与电(sh)视无兟뀂Stephen 
Jay Gould 把相兛_致的无效假设UCؓ「可能是人类推理上两三种最严重和最普遍的错误」?#160;

错误二分法/排中Qexcluded middle / false dichotomyQ: 
只考虑极端。很多h用亚理士多d式(AristotelianQ的「非此即役{的逻辑去解释上下、黑白、对错、爱恶等。(例如Q你若非喜欢它,是不喜Ƣ它。他 如不是有|,是无罪。)很多时h们没有看到在两个极端之间出现的连l,q个宇宙也包含很多「可能」的?#160;

隐藏证据Qhalf truths / suppressed evidenceQ: 
故意ƺ骗的陈qͼ通常隐藏一些事实,而那是构成准描q所必需的?#160;

暗示Q诱导性问题(loaded questionsQ: 
问题加入假设Q一旦回{便昄了一个暗C性的同意。(例如Q你停止了打你的d吗?Q?#160;

无意义的问题Qmeaningless questionQ: 
Q例如「上面有多高Q」「一切皆可能吗?」)「上面」描q方向,不是可衡量的单位。假如一切都证实可能Q那麽「不可能」都可能出现Q矛盾便出现。尽一切不一?证实可能Q亦可以有无数的可能和无数的不可能。很多无意思的问题都包含了I废的词语,?#160;
"is," "are," "were," "was," "am," "be," ?"been." 

l计性质的误解(misunderstanding the nature of statisticsQ: 
Q例如:大多数美国h都死在医院内Q所以应量q离医院。)「统计显C,通常染上q食习惯的hQ很能生存。?- Wallace Irwin 

不当l论Qnon sequiturQ: 
拉丁语「它没有跟随」的意思。推断或l论没有跟随已徏立的前提或证据。(例如Q在月圆时出生的多。结论:月圆引致出生率上升。)可是Q是月圆引致较多出生Q?q是由於其他原因Q可能是l计上的期望差异Q? 

监视下的选择Qobservational selectionQ: 
Q类似确认性偏见)指出有利的,却忽略不利的事实。谁去过拉斯l加斯(Las 
VegasQ赌Z见到Z在赌桌上和老虎Z赢钱Q赌场经理会响钟及鸣W以公告胜利者,却永不会提及p|者。这可o得胜出的Z看来颇大Q但是事实却刚刚 相反?#160;

错误因果Qpost hoc, ergo propter hocQ: 
拉丁语「它发生在之後,所以它是结果。」与不当l论cMQ不q与旉有关。(例如Q她M中国之後病了Q所以中国有些东西o到她病。)可能她的病是由於其他原因 Q与中国完全无关?#160;

证明不存在(proving non-existenceQ: 
当辩者无法ؓ他的声称提供证据Q他可能会挑战他的对手,叫对手证明他的声UC存在。(例如Q证明神不存在;证明不明飞行物体未曾到过地球Q等{)管有h可以?特定的限制中证明不存在,如在盒中没有某些东西Q可是却无法证明普遍性、绝Ҏ(gu)或认知性的不存在。无证明一些不存在的东ѝ提出声U的人必需自己证明那声U?的存在?#160;

扯开话题Qred herringQ: 
辩者改变话题,以分散注意力?#160;

实体化谬误(reification fallacyQ: 
当h们把抽象的信忉|假设性的构想Q当作是实在的事物。如以テQ题作ؓ真实衡量智慧的方法;由抽象的C会构想而来的种族概念(管基因属性的存在Q,源自l拣?的属性组合,或者标{某一lhQ占星;耶稣Q圣诞老hQ等{?#160;

滑坡谬误Qslippery slopeQ: 
一个步骤、法律、或行动的改变,可引致不良的後果。(例如Q如果我们容许医生帮助安乐死Q那麽去到最後,政府会控制我们如何死。)不一定只因ؓ我们的改变,出现 了滑坡,便会佉K计的後果实现?#160;

片面辩护Qspecial pleadingQ: 
以新鲜或特别的声Uͼ抗衡Ҏ(gu)的陈qͼ展示论据时只着重主题中有利或单一的范畴。(例如Q神Z在世上创造这麽多苦难Q答案是Q你必须明白Q神自有神奇的安排 Q我们没有特权去知道的。又例如Q星座是准确的,但你必须先了解背後的理论。) 

众l计Qstatistics of small numbersQ: 
cM监视下的选择。(例如Q我的父母吸了一世烟Q但他们从未(zhn)过癌症。又例如Q我不管其他人如何讲 ToyotaQ我?Toyota 
却从未发生过问题。)只指出少量有利数据,与整体机会ƈ无关pR〔译注:?Yugo Ҏ(gu) Toyota 使更易明白?#160;

E草误(straw manQ: 
创造一个虚假的情况Q然後去d它。(例如Q进化论者认为所有事物都是随机的。)大部份进化论者认为,在自焉择的解释下Q可能包括偶发的成䆾Q但q全然依靠 随机。抹黑你的对手只会o讨论的功能偏R?#160;

你我皆错Qtwo wrongs make a rightQ: 
指控其他我们所做的同样事情Qؓ我们所作所护。(例如Q你有甚麽资格批评我Q你也跟我做着一模一L事情Q)控方的所犯的|与讨论本nq无兌?#160;

分散注意力的谬误QFallacies of DistractionQ?#160;

     * 两难推理QFalse DilemmaQ?#160;
错谬Qؓ多於一个答案的问题提供不Q通常两个Q的选择Q即是隐藏了一些选择Q最典型的表现是非黑即白观点?#160;
     * 例子Q萨辑֧是邪恶的Q所以美军是正义之师?#160;
     * 解释Q除正邪之争外,q有邪邪之争及许多难分正邪的U争Q所以不能单以萨辑֧邪恶便认定美军正义?#160;

     * 诉诸无知QFrom IgnoranceQ?错谬Q因Z能否定,所以必然肯定,反之亦然?#160;
     * 例子Q没有h能证明鬼不存在,那麽D定存在?#160;
     * 解释QL些事是既不能否定Q亦不能肯定的。除了肯定和否定Q我们还可以存疑吧! 

     * 滑坡谬误QSlippery SlopeQ?错谬Q不合理使用q串因果关系?#160;
     * 
例子Q迟到的学生要判d。因到是不用功的表现Q将来工作也不勤力;不勤力导致公司损失;公司损失׃倒闭Q公司倒闭会人失业;׃造成家庭问题Q家庭问 题导致自杀率上升,Z防止自杀率上升,我们应判q到的学生死刑?#160;
     * 
解释Q滑坡谬误中假定了连丌Ӏ可能性」ؓ「必然性」。比方说Q迟到是否「必然」是不用功的表现Q将来工作又是否「必然」不勤力Q答案可惌知。例子虽然夸张,?其实许多时候大家亦会犯相同错误而不自知?#160;

     * 复合问题QComplex QuestionQ?错谬Q一条问题内包含两个无关的重炏V?#160;
     * 例子Q你q有没有q那非法勑ֽQ(你有q非法勾当吗Q是否还有l?Q?#160;
     * 解释Q简单的一句提问,其实隐藏了两个问题。你l予其中一条问题的{案Qƈ不一定和另外一条的一栗例如你有干非法勑ֽQ但未必{於你还有l?#160;

诉诸其他支持QAppeals to Motives in Place of SupportQ?#160;

     * 诉诸势力QAppeal to ForceQ?错谬Q以势力服h?#160;
     * 例子Q若你不惌解雇Q你必须认同公司的制度?#160;
     * 解释Q这是以工作Z员工认同制度Q员工不是依据制度好坏来军_认同与否?#160;

     * 诉诸怜?zhn)QAppeal to PityQ?错谬Q以别h的同情心服h?#160;
     * 例子Q希望你接受我这个多月来天天通宵撰写的徏议书?#160;
     * 解释Q徏议书的好坏,不在乎花了多时_而是取决於其内容Q提出「多月来天天通宵撰写」只为搏取同情?#160;

     * 诉诸l果QConsequencesQ?错谬Q以讨好或不讨好的结果服人?#160;
     * 例子Q你若不听我的话Q我便打你,不准你外出,扣v你的零用?#160;

     * 诉诸不中肯字词(Prejudicial LanguageQ?错谬Q以不中肯的字词修饰论点?#160;
     * 例子Q凡是爱国的人都会认同订立国家安全法的必要?#160;

     * 诉诸大众QPopularityQ?错谬Q以被广泛接Uؓ理由服h?#160;
     * 例子Q看Qh人都q样_q会错吗Q?#160;

     * 一厢情愿(Wishful ThinkingQ?错谬Q以自己单方面想法作证根据?#160;
     * 例子Q因为我希望明天在户外打球,所以明天一定天晴?#160;

改变话题QChanging the SubjectQ?#160;

     * ndQAttacking the PersonQ?错谬〔一〕:以攻daZ替攻d论点Q因人废aQ?#160;
     * 例子    Q张厂长反对陈主d加成本会计部的徏议:「你当然说成本会计十分重要,因ؓ你是会计MQ。?#160;
     * 错谬〔二〕:由回应论Ҏ(gu)变ؓd论点发v人的处境?#160;
     * 例子    Q你竟相信那些草栚w层的说话Q?#160;
     * 错谬〔三〕:提出「你也是Q」的不恰当反问作论据?#160;
     * 例子    Q父Q吸烟对健康不好Q儿Qؓ什麽你也吸Q?#160;

     * 诉诸权威QAppeal to AuthorityQ?错谬〔一〕:诉诸讨论的范畴以外的权威人士?#160;
     * 例子    Q经学安认ؓ爱因斯坦的相对论是不可能的?#160;
     * 错谬〔二〕:诉诸权威人士的个人意见?#160;
     * 例子    Q罗局长说Q「学生是政府的政{下最大得益者,所以学生无权批评领gh?#160;
     * 解释    Q学生是政府的政{下最大得益者只是罗局长的说话Q事实上学生是否政府的政{下最大得益者,却没有一个客观答案?#160;
     * 错谬〔三〕:该范畴的权威人士不是认真的回应。(例如Q只是在开玩笑Q喝醉。) 
     * 例子    Q「有香R自然有美人,QIQZ的d司董事长都这栯啦!?#160;

     * 匿名权威QAnonymous AuthorityQ?错谬Q匿名的权威人士使h不能定其权威性?#160;
     * 例子Q有位心理学家曾l说q,每h都有犯罪們֐?#160;

     * 作风盖过本体QStyle Over SubstanceQ?错谬Q讨以作风盖过事g本n使h认ؓ其论Ҏ(gu)?#160;
     * 例子Q以他一向的对h的态度Q他一定不会对你好的?#160;

归纳的谬误(Inductive FallaciesQ?#160;

     * ȝ的归UIHasty GeneralizationQ?错谬Q用作归UxM的样本太?#160;
     * 例子Q我问了十个人,有九(ji)个说反对民主党。结论:原来?ji)成香港人反?gu)d?#160;
     * 解释Q单凭十个h论断香港七百万hQ未免太ȝ吧。若说访问了C人,得出来的l果便较有说服力?#160;

     * 不具代表性的例子QUnrepresentative SampleQ?错谬Q用作归U的例子不能代表其M?#160;
     * 例子Q叶l欢持械行劫Q林q云奸杀多女Q欧阳炳强纸盒藏屍。香港h肯定有杀人們֐?#160;

     * 不当cLQWeak AnalogyQ?错谬Q以两g不相似的事gQ事物作cL?#160;
     * 例子Q他Ҏ(gu)友这麽好Q对x友一定很好呢?#160;

     * 懒散的归UISlothful InductionQ?错谬Q否定归U_出来的恰当结论?#160;
     * 例子Q即使有万多个实验证明化学物质媄响我们的感觉Q我是不相信?#160;

     * 排除证据谬误QFallacy of ExclusionQ?错谬Q故意把重要的证据隐藏,以得Z同的l论?#160;
     * 例子Q?#160;

l计三段论的谬误QFallacies Involving Statistical SyllogismsQ?#160;

     * 例外QAccidentQ?错谬Q以概括情况加诸应有的例外情c?#160;
     * 例子Q政府法例规定,行走此公路的汽R最高时速ؓ七十公里。所以即使蝲着快要生的妇,亦不可开得快q七十公里?#160;

     * 相反的例外(Converse AccidentQ?错谬Q以例外情况加诸应有的概括情c?#160;
     * 例子Q我们准许濒ȝ病h注射h英,基於Zhq等Q也应让其他人注vz英?#160;

因果的谬误(Causal FallaciesQ?#160;

     * 巧合谬误QCoincidental CorrelationQ?错谬Q以个别情况肯定某种因果关系?#160;
     * 例子Q希希吃了一U药Q出现过敏反应。因此,希希认ؓq种药必然导致过敏反应?#160;
     * 解释Q希希遇到的只是个别例子Q不能因此论断该药必然导致过敏反应?#160;

     * 复合l果QJoint EffectQ?错谬Q当两g事都为某原因的结果时Q以一事ؓ另一事的原因?#160;
     * 例子Q记者报导离乡背井的战争难民中的一家hQ「他们因为房子被炮火所毁而逃到q里。?#160;
     * 解释Q炮火导致这家h的房子被毁及M逃难Q房子被毁ƈ不导致这家hd原居地?#160;

     * 无轻重QGenuine but Insignificant CauseQ?错谬QD出无重的ơ要原因Q遗漏真正的d?#160;
     * 例子Q吸烟香港I气质素每况愈下?#160;
     * 解释Q导致香港空气质素差的主因是交通公L废气和天气情c?#160;

     * 倒果为因QWrong DirectionQ?错谬Q颠倒事件的因果关系?#160;
     * 例子Q癌症导致吸?#160;
     * 解释Q吸烟才是癌症的原因?#160;

     * 复合原因QComplex CauseQ?错谬Q只指出多个原因中的其中一个ؓ事gd?#160;
     * 例子Q你一日到晚都只是玩游戏机而不温习Q难怪你考试成W那麽差?#160;
     * 解释Q除了玩游戏不温习外,q有其他原因Q例如考试期间一时大意或者试题太难,但它们和玩游戏机一P不一定是d?#160;

论点~失谬误QMissing the PointQ?#160;

     * 乞求Q窃取论点(Begging the QuestionQ?错谬Q以假定正确的论点得出结论?#160;
     * 例子Q我知道有上帝,因ؓ《圣l》是q样_而《圣l》是不会错,因ؓ它是上帝写的?#160;

     * 不恰当结论(Irrelevant ConclusionQ?错谬Q提Z支持的论据主要支持其他结论?#160;
     * 例子Q?#160;

     * E草误(Straw ManQ?错谬Q扭曲对方论据以d之?#160;
     * 例子Q进化论说h是由猩猩演化而来?#160;
     * 解释Q进化论只是说h和猩猩有共同先?#160;

含糊不清谬误QFallacies of AmbiguityQ?#160;

     * 含糊其辞QEquivocationQ?错谬Q用有多於一个含义的字眼?#160;
     * 例子Q甲Q喇叭中学又发生学生D斗事g。乙Q噢Q是?ji)龙那所吗?Ԍ&%^%$&%$#... 
     * 解释Q甲q里没有表明是新界喇叭,使乙误会成九(ji)龙的喇叭书院?#160;

     * 模棱两可QAmphibolyQ?错谬Q句子结构含多种解释Ҏ(gu)?#160;
     * 例子Q?#160;

     * 重音谬误QAccentQ?错谬Q以重音某字眼或字句Q达致其他意思?#160;
     * 例子Q?#160;

cȝ错误QCategory ErrorsQ?#160;

     * 构成谬误QCompositionQ?错谬Q以M的某部䆾W合某条件推断M均符合某条g?#160;
     * 例子Q?#160;

     * 分割谬误QDivisionQ?错谬Q以MW合某条件推断M的所有部份均W合某条件?#160;
     * 例子Q?#160;

不根据前题的推理QNon SequiturQ?#160;

     * 肯定後gQAffirming the ConsequentQ?错谬Q所有依此结构的推论Q若A则必定BQBQ所以便A?#160;
     * 例子Q如果他在中环,他一定在港岛。因此如果他现在在港岛,他一定在中环?#160;
     * 解释Q在港岛不一定要在中环,可以在金钟、湾仔、铜锣湾{。因港岛包含了以上各V?#160;

     * 否定前gQDenying the AntecedentQ?错谬Q所有依此结构的推论Q若A则必定BQ?非AQ所以非B?#160;
     * 例子Q如果他在中环,他一定在港岛。因此如果他现在不在中环Q那麽他一定不在港岛?#160;
     * 解释Q不在中环,也可以在金钟、湾仔、铜锣湾{。因港岛包含了以上各V?#160;

     * 前後矛盾QInconsistencyQ?错谬Q断a两g矛盾的事仉正确 



OxFAN 2009-04-30 13:02 发表评论
]]>
C++虚函数表解析[转蝲]http://m.shnenglu.com/ofan/archive/2009/04/30/81537.htmlOxFANOxFANThu, 30 Apr 2009 03:02:00 GMThttp://m.shnenglu.com/ofan/archive/2009/04/30/81537.htmlhttp://m.shnenglu.com/ofan/comments/81537.htmlhttp://m.shnenglu.com/ofan/archive/2009/04/30/81537.html#Feedback1http://m.shnenglu.com/ofan/comments/commentRss/81537.htmlhttp://m.shnenglu.com/ofan/services/trackbacks/81537.html

(注:个h觉得q篇文章不错故{载了)

     C++中的虚函数的作用主要是实C多态的机制。关于多态,而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子cȝ成员函数。这U技术可以让父类的指针有“多种形?#8221;Q这是一U泛型技术。所谓泛型技术,说白了就是试图用不变的代码来实现可变的法。比如:模板技术,RTTI技术,虚函数技术,要么是试囑ց到在~译时决议,要么试图做到q行时决议?/p>

关于虚函数的使用Ҏ(gu)Q我在这里不做过多的阐述。大家可以看看相关的C++的书c。在q篇文章中,我只想从虚函数的实现机制上面为大?一个清晰的剖析?/p>

当然Q相同的文章在网上也出现q一些了Q但我L觉这些文章不是很Ҏ(gu)阅读Q大D大D늚代码Q没有图片,没有详细的说明,没有比较Q没有D一反三。不利于学习和阅读,所以这是我惛_下这文章的原因。也希望大家多给我提意见?/p>

a归正传,让我们一赯入虚函数的世界?/p>

虚函数表

对C++ 了解的h都应该知道虚函数QVirtual FunctionQ是通过一张虚函数表(Virtual TableQ来实现的。简UCؓV-Table?在这个表中,L要一个类的虚函数的地址表,q张表解决了l承、覆盖的问题Q保证其容真实反应实际的函数。这P在有虚函数的cȝ实例中这个表被分配在?q个实例的内存中Q所以,当我们用父类的指针来操作一个子cȝ时候,q张虚函数表显得由为重要了Q它?yu)像一个地图一P指明了实际所应该调用的函数?/p>

q里我们着重看一下这张虚函数表。在C++的标准规D明书中说刎ͼ~译器必需要保证虚函数表的指针存在于对象实例中最前面的位|(q是Z保证正确取到虚函数的偏移量)?q意味着我们通过对象实例的地址得到q张虚函数表Q然后就可以遍历其中函数指针Qƈ调用相应的函数?/p>

听我扯了那么多,我可以感觉出来你现在可能比以前更加晕头{向了?没关p,下面是实际的例子,怿聪明的你一看就明白了?/p>

假设我们有这L一个类Q?/p>

class Base {

public:

virtual void f() { cout << "Base::f" << endl; }

virtual void g() { cout << "Base::g" << endl; }

virtual void h() { cout << "Base::h" << endl; }

};

按照上面的说法,我们可以通过Base的实例来得到虚函数表?下面是实际例E:

typedef void(*Fun)(void);

Base b;

Fun pFun = NULL;

cout << "虚函数表地址Q? << (int*)(&b) << endl;

cout << "虚函数表 ?W一个函数地址Q? << (int*)*(int*)(&b) << endl;

// Invoke the first virtual function

pFun = (Fun)*((int*)*(int*)(&b));

pFun();

实际q行l果如下Q?Windows XP+VS2003, Linux 2.6.22 + GCC 4.1.3)

虚函数表地址Q?012FED4

虚函数表 ?W一个函数地址Q?044F148

Base::f

通过q个CZQ我们可以看刎ͼ我们可以通过?amp;b转成int *Q取得虚函数表的地址Q然后,再次取址可以得到第一个虚函数的地址了,也就是Base::f()Q这在上面的E序中得C验证Q把int* 强制转成了函数指针)。通过q个CZQ我们就可以知道如果要调用Base::g()和Base::h()Q其代码如下Q?/p>

(Fun)*((int*)*(int*)(&b)+0); // Base::f()

(Fun)*((int*)*(int*)(&b)+1); // Base::g()

(Fun)*((int*)*(int*)(&b)+2); // Base::h()

q个时候你应该懂了吧。什么?q是有点晕。也是,q样的代码看着太ؕ了。没问题Q让我画个图解释一下。如下所C:

注意Q在上面q个图中Q我在虚函数表的最后多加了一个结点,q是虚函数表的结束结点,像字符串的l束W?#8220;\0”一P其标志了虚函数表的结束。这个结束标志的值在不同的编译器下是不同的。在WinXP+VS2003下,q个值是NULL。而在Ubuntu 7.10 + Linux 2.6.22 + GCC 4.1.3下,q个值是如果1Q表C有下一个虚函数表,如果值是0Q表C是最后一个虚函数表?/p>

下面Q我分别说?#8220;无覆?#8221;?#8220;有覆?#8221;时的虚函数表的样子。没有覆盖父cȝ虚函数是毫无意义的。我之所以要讲述没有覆盖的情况,主要目的是ؓ了给一个对比。在比较之下Q我们可以更加清楚地知道其内部的具体实现?/p>

一般承(无虚函数覆盖Q?/h3>

下面Q再让我们来看看l承时的虚函数表是什么样的。假设有如下所C的一个承关p:

h意,在这个承关pMQ子cL有重载Q何父cȝ函数。那么,在派生类的实例中Q其虚函数表如下所C:

对于实例QDerive d; 的虚函数表如下:

我们可以看到下面几点Q?/p>

1Q虚函数按照其声明顺序放于表中?/p>

2Q父cȝ虚函数在子类的虚函数前面?/p>

我相信聪明的你一定可以参考前面的那个E序Q来~写一D늨序来验证?/p>

一般承(有虚函数覆盖Q?/h3>

覆盖父类的虚函数是很昄的事情,不然Q虚函数变得毫无意义。下面,我们来看一下,如果子类中有虚函数重载了父类的虚函数Q会是一个什么样子?假设Q我们有下面q样的一个承关pR?/p>

Z让大家看到被l承q后的效果,在这个类的设计中Q我只覆盖了父类的一个函敎ͼf()。那么,对于zcȝ实例Q其虚函数表会是下面的一个样子:

我们从表中可以看C面几点,

1Q覆盖的f()函数被放C虚表中原来父c虚函数的位|?/p>

2Q没有被覆盖的函C旧?/p>

q样Q我们就可以看到对于下面q样的程序,

Base *b = new Derive();

b->f();

由b所指的内存中的虚函数表的f()的位|已l被Derive::f()函数地址所取代Q于是在实际调用发生Ӟ是Derive::f()被调用了。这实C多态?/p>

多重l承Q无虚函数覆盖)

下面Q再让我们来看看多重l承中的情况Q假设有下面q样一个类的承关pR注意:子类q没有覆盖父cȝ函数?/p>

对于子类实例中的虚函数表Q是下面q个样子Q?/p>

我们可以看到Q?/p>

1Q?每个父类都有自己的虚表?/p>

2Q?子类的成员函数被攑ֈ了第一个父cȝ表中。(所谓的W一个父cL按照声明序来判断的Q?/p>

q样做就是ؓ了解决不同的父类cd的指针指向同一个子cd例,而能够调用到实际的函数?/p>

多重l承Q有虚函数覆盖)

下面我们再来看看Q如果发生虚函数覆盖的情c?/p>

下图中,我们在子cM覆盖了父cȝf()函数?/p>

下面是对于子cd例中的虚函数表的图:

我们可以看见Q三个父c虚函数表中的f()的位|被替换成了子类的函数指针。这P我们可以Q一静态类型的父类来指向子c,q调用子cȝf()了。如Q?/p>

Derive d;

Base1 *b1 = &d;

Base2 *b2 = &d;

Base3 *b3 = &d;

b1->f(); //Derive::f()

b2->f(); //Derive::f()

b3->f(); //Derive::f()

b1->g(); //Base1::g()

b2->g(); //Base2::g()

b3->g(); //Base3::g()

安全?/h3>

每次写C++的文章,d不了要批判一下C++。这文章也不例外。通过上面的讲qͼ怿我们对虚函数表有一个比较细致的了解了。水可蝲舟,亦可覆舟。下面,让我们来看看我们可以用虚函数表来q点什么坏事吧?/p>

一、通过父类型的指针讉K子类自己的虚函数

我们知道Q子cL有重载父cȝ虚函数是一件毫无意义的事情。因为多态也是要Z函数重蝲的。虽然在上面的图中我们可以看到Base1的虚表中有Derive的虚函数Q但我们Ҏ(gu)不可能用下面的语句来调用子cȝ自有虚函敎ͼ

Base1 *b1 = new Derive();

b1->f1(); //~译出错

M妄图使用父类指针惌用子cM?strong>未覆盖父cȝ成员函数的行为都会被~译器视为非法,所以,q样的程序根本无法编译通过。但在运行时Q我们可以通过指针的方式访问虚函数表来辑ֈq反C++语义的行为。(关于q方面的试Q通过阅读后面附录的代码,怿你可以做到这一点)

二、访问non-public的虚函数

另外Q如果父cȝ虚函数是private或是protected的,但这些非public的虚函数同样会存在于虚函数表中,所以,我们同样可以使用讉K虚函数表的方式来讉Kq些non-public的虚函数Q这是很Ҏ(gu)做到的?/p>

如:

class Base {

private:

virtual void f() { cout << "Base::f" << endl; }

};

class Derive : public Base{

};

typedef void(*Fun)(void);

void main() {

Derive d;

Fun pFun = (Fun)*((int*)*(int*)(&d)+0);

pFun();

}

l束?/h3>

C++q门语言是一门Magic的语aQ对于程序员来说Q我们似乎永q摸不清楚这门语a背着我们在干了什么。需要熟(zhn)这门语aQ我们就必需要了解C++里面的那些东西,需要去了解C++中那些危险的东西。不Ӟq是一U搬L头砸自己脚的~程语言?/p>

OxFAN 2009-04-30 11:02 发表评论
]]>落户CPPBLOGhttp://m.shnenglu.com/ofan/archive/2009/04/29/81421.htmlOxFANOxFANWed, 29 Apr 2009 05:02:00 GMThttp://m.shnenglu.com/ofan/archive/2009/04/29/81421.htmlhttp://m.shnenglu.com/ofan/comments/81421.htmlhttp://m.shnenglu.com/ofan/archive/2009/04/29/81421.html#Feedback0http://m.shnenglu.com/ofan/comments/commentRss/81421.htmlhttp://m.shnenglu.com/ofan/services/trackbacks/81421.html

OxFAN 2009-04-29 13:02 发表评论
]]>
һaɫƬþ| պŷۺϾþӰԺDs| Ʒþþþù3d| ާѡþþþƷ9966| һƷ˾þ| պƷþþվ| ھƷþù½| þ޹Ʒ123| þþþþþž99Ʒ| ƷþþĻ| þǿdŮվ | һaƬþëƬ16| þۺϾɫŷۺϺݺ| ޹ƷƬþ| ޹պŷۺϾþ| Ʒþþþþþþҹ| Ʒ˾þô߽ɫҳ| ƷѾþþþõӰ| ˾ƷþѶ| 66þôýվȸ| Ѿþþþþ| þþƷ99Ʒ | ŷƷƵһþþþƷ| ͵͵þþþվ| ޾Ʒtvþþþ| þúݺɫۺ| ŮƷþþþ| þùɫavѿ| þþøƵ| ˾þô߽AVһ | þ㽶߿ۿ | þþþø߳ëƬȫ| ۺϾþþƷɫ| һþƵ| þþþþþƷþþþ| þˬ˾ƷƵ| þþƷֻоƷ66| ˾þô߽ۺ5g| 㽶aaþëƬ| þˬˬƬAV | þҹ³˿Ƭϼ|