Files
hustoj/web/cppreference-zh/chmhelp/cpp-language-virtual.html
2025-08-01 12:57:54 +08:00

335 lines
43 KiB
HTML

<!DOCTYPE html>
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>virtual &#20989;&#25968;&#35828;&#26126;&#31526;</title>
<link rel="stylesheet" href="ext.css" />
<link rel="stylesheet" href="site_modules.css" />
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_virtual skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">virtual &#20989;&#25968;&#35828;&#26126;&#31526;</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="cpp.html">cpp</a>&lrm; | <a href="cpp-language.html">language</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">virtual</span></span></span> &#35828;&#26126;&#31526;&#25351;&#23450;&#38750;&#38745;&#24577;<a href="cpp-language-member_functions.html">&#25104;&#21592;&#20989;&#25968;</a>&#20026;<i>&#34394;</i>&#20989;&#25968;&#24182;&#25903;&#25345;&#21160;&#24577;&#35843;&#29992;&#27966;&#21457;&#12290;&#23427;&#21482;&#33021;&#22312;&#38750;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;&#30340;&#39318;&#20010;&#22768;&#26126;&#65288;&#21363;&#24403;&#23427;&#22312;&#31867;&#23450;&#20041;&#20013;&#22768;&#26126;&#26102;&#65289;&#30340; <span class="t-spar">&#22768;&#26126;&#35828;&#26126;&#31526;&#24207;&#21015;</span> &#20013;&#20986;&#29616;&#12290;</p>
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">&#35299;&#37322;</span></h3>
<p>&#34394;&#20989;&#25968;&#26159;&#20854;&#34892;&#20026;&#21487;&#20197;&#22312;&#27966;&#29983;&#31867;&#20013;&#35206;&#30422;&#30340;&#25104;&#21592;&#20989;&#25968;&#12290;&#19982;&#38750;&#34394;&#20989;&#25968;&#30456;&#21453;&#65292;&#21363;&#20351;&#27809;&#26377;&#20851;&#20110;&#35813;&#31867;&#23454;&#38469;&#31867;&#22411;&#30340;&#32534;&#35793;&#26102;&#20449;&#24687;&#65292;&#36827;&#34892;&#35206;&#30422;&#30340;&#34892;&#20026;&#20173;&#28982;&#20445;&#30041;&#12290;&#24403;&#20351;&#29992;&#21040;&#22522;&#31867;&#30340;&#25351;&#38024;&#25110;&#24341;&#29992;&#26469;&#22788;&#29702;&#27966;&#29983;&#31867;&#26102;&#65292;&#23545;&#34987;&#35206;&#30422;&#30340;&#34394;&#20989;&#25968;&#30340;&#35843;&#29992;&#65292;&#23558;&#20250;&#35843;&#29992;&#23450;&#20041;&#20110;&#27966;&#29983;&#31867;&#20013;&#30340;&#34892;&#20026;&#12290;&#36825;&#31181;&#20989;&#25968;&#35843;&#29992;&#34987;&#31216;&#20026;<i>&#34394;&#20989;&#25968;&#35843;&#29992;</i>&#25110;<i>&#34394;&#35843;&#29992;</i>&#12290;&#34394;&#20989;&#25968;&#35843;&#29992;&#22312;&#20351;&#29992;<a href="cpp-language-lookup.html">&#26377;&#38480;&#23450;&#21517;&#23383;&#26597;&#25214;</a>&#65288;&#21363;&#20989;&#25968;&#21517;&#20986;&#29616;&#22312;&#20316;&#29992;&#22495;&#35299;&#26512;&#36816;&#31639;&#31526; <code>::</code> &#30340;&#21491;&#20391;&#65289;&#26102;&#34987;&#25233;&#21046;&#12290;</p>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="co2">#include &lt;iostream&gt;</span>
<span class="kw1">struct</span> Base <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;&#22522;<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> Derived <span class="sy4">:</span> Base <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> override <span class="br0">{</span> <span class="co1">// &#39;override&#39; &#21487;&#36873;</span>
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;&#27966;&#29983;<span class="es1">\n</span>&quot;</span><span class="sy4">;</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
Base b<span class="sy4">;</span>
Derived d<span class="sy4">;</span>
<span class="co1">// &#36890;&#36807;&#24341;&#29992;&#35843;&#29992;&#34394;&#20989;&#25968;</span>
Base<span class="sy3">&amp;</span> br <span class="sy1">=</span> b<span class="sy4">;</span> <span class="co1">// br &#30340;&#31867;&#22411;&#26159; Base&amp;</span>
Base<span class="sy3">&amp;</span> dr <span class="sy1">=</span> d<span class="sy4">;</span> <span class="co1">// dr &#30340;&#31867;&#22411;&#20063;&#26159; Base&amp;</span>
br.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25171;&#21360; &quot;&#22522;&quot;</span>
dr.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25171;&#21360; &quot;&#27966;&#29983;&quot;</span>
<span class="co1">// &#36890;&#36807;&#25351;&#38024;&#35843;&#29992;&#34394;&#20989;&#25968;</span>
Base<span class="sy2">*</span> bp <span class="sy1">=</span> <span class="sy3">&amp;</span>b<span class="sy4">;</span> <span class="co1">// bp &#30340;&#31867;&#22411;&#26159; Base*</span>
Base<span class="sy2">*</span> dp <span class="sy1">=</span> <span class="sy3">&amp;</span>d<span class="sy4">;</span> <span class="co1">// dp &#30340;&#31867;&#22411;&#20063;&#26159; Base*</span>
bp<span class="sy2">-</span><span class="sy1">&gt;</span>f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25171;&#21360; &quot;&#22522;&quot;</span>
dp<span class="sy2">-</span><span class="sy1">&gt;</span>f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25171;&#21360; &quot;&#27966;&#29983;&quot;</span>
<span class="co1">// &#38750;&#34394;&#20989;&#25968;&#35843;&#29992;</span>
br.<span class="me1">Base</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25171;&#21360; &quot;&#22522;&quot;</span>
dr.<span class="me1">Base</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#25171;&#21360; &quot;&#22522;&quot;</span>
<span class="br0">}</span></pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E7.BB.86.E8.8A.82">&#32454;&#33410;</span></h3>
<p>&#22914;&#26524;&#26576;&#20010;&#25104;&#21592;&#20989;&#25968; <code>vf</code> &#22312;&#31867; <code>Base</code> &#20013;&#34987;&#22768;&#26126;&#20026; <code>virtual</code>&#65292;&#19988;&#26576;&#20010;&#30452;&#25509;&#25110;&#38388;&#25509;&#27966;&#29983;&#20110; <code>Base</code> &#30340;&#31867; <code>Derived</code> &#25317;&#26377;&#19968;&#20010;&#19979;&#21015;&#20960;&#39033;&#19982;&#20043;&#30456;&#21516;&#30340;&#25104;&#21592;&#20989;&#25968;&#22768;&#26126;&#65306;</p>
<ul>
<li>&#21517;&#23383;</li>
<li>&#24418;&#21442;&#21015;&#34920;&#65288;&#20294;&#38750;&#36820;&#22238;&#31867;&#22411;&#65289;</li>
<li>cv &#38480;&#23450;&#31526;</li>
<li>&#24341;&#29992;&#38480;&#23450;&#31526;</li>
</ul>
<p>&#37027;&#20040; <code>vf</code> &#22312;&#31867; <code>Derived</code> &#20013;&#20063;&#26159;<i>&#34394;</i>&#20989;&#25968;&#65288;&#26080;&#35770;&#20854;&#22768;&#26126;&#20013;&#26159;&#21542;&#20351;&#29992;&#20851;&#38190;&#35789; <code>virtual</code>&#65289;&#24182;<i>&#35206;&#30422;</i> Base::vf&#65288;&#26080;&#35770;&#20854;&#22768;&#26126;&#20013;&#26159;&#21542;&#20351;&#29992;&#21333;&#35789; <code>override</code>&#65289;&#12290;</p>
<p>&#35201;&#35206;&#30422;&#30340; <code>Base::vf</code> &#19981;&#38656;&#35201;&#21487;&#35775;&#38382;&#25110;&#21487;&#35265;&#12290;&#65288;<code>Base::vf</code> &#33021;&#22768;&#26126;&#20026;&#31169;&#26377;&#25110;&#32773;&#31169;&#26377;&#32487;&#25215; <code>Base</code>&#12290; <code>Derived</code> &#30340;&#22522;&#31867;&#20013;&#30340;&#20219;&#20309;&#21516;&#21517;&#25104;&#21592;&#19981;&#22952;&#30861;&#35206;&#30422;&#30830;&#23450;&#65292;&#21363;&#20351;&#22312;&#21517;&#23383;&#26597;&#25214;&#26102;&#23427;&#20204;&#20250;&#38544;&#34255; <code>Base::vf</code>&#12290;&#65289;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> B <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> do_f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#31169;&#26377;&#25104;&#21592;</span>
<span class="kw1">public</span><span class="sy4">:</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> do_f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// &#20844;&#24320;&#25509;&#21475;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> D <span class="sy4">:</span> <span class="kw1">public</span> B <span class="br0">{</span>
<span class="kw4">void</span> do_f<span class="br0">(</span><span class="br0">)</span> override<span class="sy4">;</span> <span class="co1">// &#35206;&#30422; B::do_f</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
D d<span class="sy4">;</span>
B<span class="sy2">*</span> bp <span class="sy1">=</span> <span class="sy3">&amp;</span>d<span class="sy4">;</span>
bp<span class="sy2">-</span><span class="sy1">&gt;</span>f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#20869;&#37096;&#35843;&#29992; D::do_f();</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#27599;&#20010;&#34394;&#20989;&#25968;&#37117;&#26377;<i>&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;</i>&#65292;&#23427;&#26159;&#36827;&#34892;&#34394;&#20989;&#25968;&#35843;&#29992;&#26102;&#25152;&#25191;&#34892;&#30340;&#20989;&#25968;&#12290;&#22522;&#31867; <code>Base</code> &#30340;&#34394;&#25104;&#21592;&#20989;&#25968; <code>vf</code> &#26159;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#65292;&#38500;&#38750;&#27966;&#29983;&#31867;&#22768;&#26126;&#25110;&#65288;&#36890;&#36807;&#22810;&#37325;&#32487;&#25215;&#65289;&#32487;&#25215;&#20102;&#35206;&#30422; <code>vf</code> &#30340;&#21478;&#19968;&#20010;&#20989;&#25968;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> A <span class="br0">{</span> <span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// A::f &#26159;&#34394;&#20989;&#25968;</span>
<span class="kw1">struct</span> B <span class="sy4">:</span> A <span class="br0">{</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// B &#20013;&#30340; B::f &#35206;&#30422; A::f</span>
<span class="kw1">struct</span> C <span class="sy4">:</span> <span class="kw1">virtual</span> B <span class="br0">{</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// C &#20013;&#30340; C::f &#35206;&#30422; A::f</span>
<span class="kw1">struct</span> D <span class="sy4">:</span> <span class="kw1">virtual</span> B <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// D &#19981;&#24341;&#20837;&#35206;&#30422;&#20989;&#25968;&#65292;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#26159; B::f</span>
<span class="kw1">struct</span> E <span class="sy4">:</span> C, D <span class="br0">{</span> <span class="co1">// E &#19981;&#24341;&#20837;&#35206;&#30422;&#20989;&#25968;&#65292;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#26159; C::f</span>
<span class="kw1">using</span> A<span class="sy4">::</span><span class="me2">f</span><span class="sy4">;</span> <span class="co1">// &#38750;&#20989;&#25968;&#22768;&#26126;&#65292;&#21482;&#20026;&#20102;&#33021;&#35753; A::f &#34987;&#26597;&#25214;&#21040;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
E e<span class="sy4">;</span>
e.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#34394;&#35843;&#29992; e &#20013;&#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968; C::f</span>
e.<span class="me1">E</span><span class="sy4">::</span><span class="me2">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38750;&#34394;&#35843;&#29992;&#35843;&#29992;&#22312; E &#20013;&#21487;&#35265;&#30340; A::f</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#22914;&#26524;&#19968;&#20010;&#20989;&#25968;&#25317;&#26377;&#22810;&#20110;&#19968;&#20010;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> A <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> VB1 <span class="sy4">:</span> <span class="kw1">virtual</span> A <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35206;&#30422; A::f</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> VB2 <span class="sy4">:</span> <span class="kw1">virtual</span> A <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35206;&#30422; A::f</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// struct Error : VB1, VB2 {</span>
<span class="co1">// // &#38169;&#35823;&#65306;A::f &#22312; Error &#20013;&#25317;&#26377;&#20004;&#20010;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;</span>
<span class="co1">// };</span>
<span class="kw1">struct</span> Okay <span class="sy4">:</span> VB1, VB2 <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK&#65306;&#36825;&#26159; A::f &#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> VB1a <span class="sy4">:</span> <span class="kw1">virtual</span> A <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// &#19981;&#22768;&#26126;&#35206;&#30422;&#20989;&#25968;</span>
<span class="kw1">struct</span> Da <span class="sy4">:</span> VB1a, VB2 <span class="br0">{</span>
<span class="co1">// &#22312; Da &#20013;&#65292;A::f &#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#26159; VB2::f</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#21517;&#23383;&#30456;&#21516;&#20294;&#24418;&#21442;&#21015;&#34920;&#19981;&#21516;&#30340;&#20989;&#25968;&#24182;&#19981;&#35206;&#30422;&#21516;&#21517;&#30340;&#22522;&#31867;&#20989;&#25968;&#65292;&#20294;&#20250;<i>&#38544;&#34255;</i>&#23427;&#65306;&#22312;<a href="cpp-language-lookup.html">&#26080;&#38480;&#23450;&#21517;&#23383;&#26597;&#25214;</a>&#26816;&#26597;&#27966;&#29983;&#31867;&#30340;&#20316;&#29992;&#22495;&#26102;&#65292;&#26597;&#25214;&#25214;&#21040;&#35813;&#22768;&#26126;&#23601;&#19981;&#20250;&#20877;&#26816;&#26597;&#22522;&#31867;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> B <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> D <span class="sy4">:</span> B <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// D::f &#38544;&#34255; B::f&#65288;&#38169;&#35823;&#30340;&#24418;&#21442;&#21015;&#34920;&#65289;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> D2 <span class="sy4">:</span> D <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// D2::f &#35206;&#30422; B::f&#65288;&#19981;&#31649;&#23427;&#26159;&#21542;&#21487;&#35265;&#65289;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
B b<span class="sy4">;</span> B<span class="sy3">&amp;</span> b_as_b <span class="sy1">=</span> b<span class="sy4">;</span>
D d<span class="sy4">;</span> B<span class="sy3">&amp;</span> d_as_b <span class="sy1">=</span> d<span class="sy4">;</span> D<span class="sy3">&amp;</span> d_as_d <span class="sy1">=</span> d<span class="sy4">;</span>
D2 d2<span class="sy4">;</span> B<span class="sy3">&amp;</span> d2_as_b <span class="sy1">=</span> d2<span class="sy4">;</span> D<span class="sy3">&amp;</span> d2_as_d <span class="sy1">=</span> d2<span class="sy4">;</span>
b_as_b.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; B::f()</span>
d_as_b.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; B::f()</span>
d2_as_b.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; D2::f()</span>
d_as_d.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;D &#20013;&#30340;&#26597;&#25214;&#21482;&#25214;&#21040; f(int)</span>
d2_as_d.<span class="me1">f</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;D &#20013;&#30340;&#26597;&#25214;&#21482;&#25214;&#21040; f(int)</span>
<span class="br0">}</span></pre></div>
</div>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx11">
<td>
<p>&#22914;&#26524;&#20989;&#25968;&#20197;&#35828;&#26126;&#31526; <code>override</code> &#22768;&#26126;&#65292;&#20294;&#19981;&#35206;&#30422;&#20219;&#20309;&#34394;&#20989;&#25968;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> B <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> D <span class="sy4">:</span> B <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span> override<span class="sy4">;</span> <span class="co1">// OK&#65292;D::f(int) &#35206;&#30422; B::f(int)</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">long</span><span class="br0">)</span> override<span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;f(long) &#19981;&#35206;&#30422; B::f(int)</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p>&#22914;&#26524;&#20989;&#25968;&#20197;&#35828;&#26126;&#31526; <code>final</code> &#22768;&#26126;&#65292;&#32780;&#34987;&#21478;&#19968;&#20989;&#25968;&#35797;&#22270;&#35206;&#30422;&#65292;&#37027;&#20040;&#31243;&#24207;&#38750;&#33391;&#26500;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> B <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span> final<span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> D <span class="sy4">:</span> B <span class="br0">{</span>
<span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;D::f &#35797;&#22270;&#35206;&#30422; final B::f</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></td>
</tr>
</table>
<p>&#38750;&#25104;&#21592;&#20989;&#25968;&#21644;&#38745;&#24577;&#25104;&#21592;&#20989;&#25968;&#19981;&#33021;&#26159;&#34394;&#20989;&#25968;&#12290;</p>
<p>&#20989;&#25968;&#27169;&#26495;&#19981;&#33021;&#34987;&#22768;&#26126;&#20026; <code>virtual</code>&#12290;&#36825;&#21482;&#36866;&#29992;&#20110;&#33258;&#36523;&#26159;&#27169;&#26495;&#30340;&#20989;&#25968;&mdash;&mdash;&#31867;&#27169;&#26495;&#30340;&#24120;&#35268;&#25104;&#21592;&#20989;&#25968;&#21487;&#20197;&#34987;&#22768;&#26126;&#20026;&#34394;&#20989;&#25968;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-cxx20">
<td>
<p>&#34394;&#20989;&#25968;&#65288;&#26080;&#35770;&#26159;&#22768;&#26126;&#20026; virtual &#32773;&#36824;&#26159;&#35206;&#30422;&#20989;&#25968;&#65289;&#19981;&#33021;&#26377;&#20219;&#20309;&#20851;&#32852;&#21046;&#32422;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> A <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span> requires <span class="kw2">true</span><span class="sy4">;</span> <span class="co1">// &#38169;&#35823;&#65306;&#21463;&#21046;&#32422;&#30340;&#34394;&#20989;&#25968;</span>
<span class="br0">}</span><span class="sy4">;</span></pre></div>
</div>
<p><a href="cpp-language-consteval.html"><code>consteval</code></a> &#34394;&#20989;&#25968;&#19981;&#33021;&#35206;&#30422;&#38750; <code>consteval</code> &#34394;&#20989;&#25968;&#25110;&#34987;&#23427;&#35206;&#30422;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></td>
</tr>
</table>
<p>&#22312;&#32534;&#35793;&#26102;&#26367;&#25442;&#34394;&#20989;&#25968;&#30340;<a href="cpp-language-default_arguments.html">&#40664;&#35748;&#23454;&#21442;</a>&#12290;</p>
<h4><span class="mw-headline" id=".E5.8D.8F.E5.8F.98.E8.BF.94.E5.9B.9E.E7.B1.BB.E5.9E.8B">&#21327;&#21464;&#36820;&#22238;&#31867;&#22411;</span></h4>
<p>&#22914;&#26524;&#20989;&#25968; <code>Derived::f</code> &#35206;&#30422; <code>Base::f</code>&#65292;&#37027;&#20040;&#23427;&#30340;&#36820;&#22238;&#31867;&#22411;&#24517;&#39035;&#35201;&#20040;&#30456;&#21516;&#65292;&#35201;&#20040;&#20026;<i>&#21327;&#21464;&#65288;covariant&#65289;</i>&#12290;&#24403;&#28385;&#36275;&#20197;&#19979;&#25152;&#26377;&#35201;&#27714;&#26102;&#65292;&#20004;&#20010;&#31867;&#22411;&#20026;&#21327;&#21464;&#65306;</p>
<ul>
<li>&#20004;&#20010;&#31867;&#22411;&#37117;&#26159;&#21040;&#31867;&#30340;&#25351;&#38024;&#25110;&#24341;&#29992;&#65288;&#24038;&#20540;&#25110;&#21491;&#20540;&#65289;&#12290;&#19981;&#20801;&#35768;&#22810;&#32423;&#25351;&#38024;&#25110;&#24341;&#29992;&#12290;</li>
<li><code>Base::f()</code> &#30340;&#36820;&#22238;&#31867;&#22411;&#20013;&#34987;&#24341;&#29992;/&#25351;&#21521;&#30340;&#31867;&#65292;&#24517;&#39035;&#26159; <code>Derived::f()</code> &#30340;&#36820;&#22238;&#31867;&#22411;&#20013;&#34987;&#24341;&#29992;/&#25351;&#21521;&#30340;&#31867;&#30340;&#26080;&#27495;&#20041;&#19988;&#21487;&#35775;&#38382;&#30340;&#30452;&#25509;&#25110;&#38388;&#25509;&#22522;&#31867;&#12290;</li>
<li><code>Derived::f()</code> &#30340;&#36820;&#22238;&#31867;&#22411;&#24517;&#39035;&#26377;&#30456;&#23545;&#20110; <code>Base::f()</code> &#30340;&#36820;&#22238;&#31867;&#22411;&#30340;&#30456;&#31561;&#25110;&#36739;&#23569;&#30340; <a href="cpp-language-cv.html">cv &#38480;&#23450;</a>&#12290;</li>
</ul>
<p><code>Derived::f</code> &#30340;&#36820;&#22238;&#31867;&#22411;&#20013;&#30340;&#31867;&#24517;&#39035;&#35201;&#20040;&#26159; <code>Derived</code> &#33258;&#36523;&#65292;&#35201;&#20040;&#24517;&#39035;&#26159;&#22312; <code>Derived::f</code> &#22768;&#26126;&#28857;&#30340;&#26576;&#20010;<a href="cpp-language-incomplete_type.html" class="mw-redirect">&#23436;&#25972;&#31867;&#22411;</a>&#12290;</p>
<p>&#36827;&#34892;&#34394;&#20989;&#25968;&#35843;&#29992;&#26102;&#65292;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#30340;&#36820;&#22238;&#31867;&#22411;&#34987;<a href="cpp-language-implicit_conversion.html">&#38544;&#24335;&#36716;&#25442;</a>&#25104;&#25152;&#35843;&#29992;&#30340;&#34987;&#35206;&#30422;&#20989;&#25968;&#30340;&#36820;&#22238;&#31867;&#22411;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> B <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> Base <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> vf1<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> vf2<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> vf3<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">virtual</span> B<span class="sy2">*</span> vf4<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">virtual</span> B<span class="sy2">*</span> vf5<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">class</span> D <span class="sy4">:</span> <span class="kw1">private</span> B <span class="br0">{</span>
<span class="kw1">friend</span> <span class="kw1">struct</span> Derived<span class="sy4">;</span> <span class="co1">// &#22312; Derived &#20013;&#65292;B &#26159; D &#30340;&#21487;&#35775;&#38382;&#22522;&#31867;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">class</span> A<span class="sy4">;</span> <span class="co1">// &#21069;&#32622;&#22768;&#26126;&#30340;&#31867;&#26159;&#19981;&#23436;&#25972;&#31867;&#22411;</span>
<span class="kw1">struct</span> Derived <span class="sy4">:</span> <span class="kw1">public</span> Base <span class="br0">{</span>
<span class="kw4">void</span> vf1<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#34394;&#20989;&#25968;&#65292;&#35206;&#30422; Base::vf1()</span>
<span class="kw4">void</span> vf2<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#38750;&#34394;&#20989;&#25968;&#65292;&#38544;&#34255; Base::vf2()</span>
<span class="co1">// char vf3(); // &#38169;&#35823;&#65306;&#35206;&#30422; Base::vf3&#65292;&#20294;&#20855;&#26377;&#19981;&#21516;&#19988;&#38750;&#21327;&#21464;&#30340;&#36820;&#22238;&#31867;&#22411;</span>
D<span class="sy2">*</span> vf4<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35206;&#30422; Base::vf4() &#24182;&#20855;&#26377;&#21327;&#21464;&#30340;&#36820;&#22238;&#31867;&#22411;</span>
<span class="co1">// A* vf5(); // &#38169;&#35823;&#65306;A &#26159;&#19981;&#23436;&#25972;&#31867;&#22411;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
Derived d<span class="sy4">;</span>
Base<span class="sy3">&amp;</span> br <span class="sy1">=</span> d<span class="sy4">;</span>
Derived<span class="sy3">&amp;</span> dr <span class="sy1">=</span> d<span class="sy4">;</span>
br.<span class="me1">vf1</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; Derived::vf1()</span>
br.<span class="me1">vf2</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; Base::vf2()</span>
<span class="co1">// dr.vf2(); // &#38169;&#35823;&#65306;vf2(int) &#38544;&#34255; vf2()</span>
B<span class="sy2">*</span> p <span class="sy1">=</span> br.<span class="me1">vf4</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; Derived::vf4() &#24182;&#23558;&#32467;&#26524;&#36716;&#25442;&#20026; B*</span>
D<span class="sy2">*</span> q <span class="sy1">=</span> dr.<span class="me1">vf4</span><span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#35843;&#29992; Derived::vf4() &#32780;&#19981;&#23558;&#32467;&#26524;&#36716;&#25442;&#20026; B*</span>
<span class="br0">}</span></pre></div>
</div>
<h4><span class="mw-headline" id=".E8.99.9A.E6.9E.90.E6.9E.84.E5.87.BD.E6.95.B0">&#34394;&#26512;&#26500;&#20989;&#25968;</span></h4>
<p>&#34429;&#28982;&#26512;&#26500;&#20989;&#25968;&#19981;&#20250;&#32487;&#25215;&#65292;&#20294;&#26159;&#22914;&#26524;&#22522;&#31867;&#23558;&#20854;&#26512;&#26500;&#20989;&#25968;&#22768;&#26126;&#20026; <code>virtual</code>&#65292;&#37027;&#20040;&#27966;&#29983;&#30340;&#26512;&#26500;&#20989;&#25968;&#22987;&#32456;&#35206;&#30422;&#23427;&#12290;&#36825;&#26679;&#23601;&#21487;&#20197;&#36890;&#36807;&#25351;&#21521;&#22522;&#31867;&#30340;&#25351;&#38024; delete &#21160;&#24577;&#20998;&#37197;&#30340;&#22810;&#24577;&#31867;&#22411;&#23545;&#35937;&#12290;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">class</span> Base <span class="br0">{</span>
<span class="kw1">public</span><span class="sy4">:</span>
<span class="kw1">virtual</span> ~Base<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/* &#37322;&#25918; Base &#30340;&#36164;&#28304; */</span> <span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">class</span> Derived <span class="sy4">:</span> <span class="kw1">public</span> Base <span class="br0">{</span>
~Derived<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/* &#37322;&#25918; Derived &#30340;&#36164;&#28304; */</span> <span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
<span class="br0">{</span>
Base<span class="sy2">*</span> b <span class="sy1">=</span> new Derived<span class="sy4">;</span>
delete b<span class="sy4">;</span> <span class="co1">// &#36827;&#34892;&#23545; Base::~Base() &#30340;&#34394;&#20989;&#25968;&#35843;&#29992;</span>
<span class="co1">// &#30001;&#20110;&#23427;&#26159;&#34394;&#20989;&#25968;&#65292;&#22240;&#27492;&#23427;&#35843;&#29992;&#30340;&#26159; Derived::~Derived()&#65292;</span>
<span class="co1">// &#36825;&#23601;&#33021;&#37322;&#25918;&#27966;&#29983;&#31867;&#30340;&#36164;&#28304;&#65292;&#28982;&#21518;&#36981;&#24490;&#36890;&#24120;&#30340;&#26512;&#26500;&#39034;&#24207;</span>
<span class="co1">// &#35843;&#29992; Base::~Base()</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#27492;&#22806;&#65292;&#22914;&#26524;&#22522;&#31867;&#30340;&#26512;&#26500;&#20989;&#25968;&#38750;&#34394;&#65292;&#21017;&#36890;&#36807;&#25351;&#21521;&#35813;&#22522;&#31867;&#30340;&#25351;&#38024;&#21024;&#38500;&#27966;&#29983;&#31867;&#23545;&#35937;&#26159;<i>&#26410;&#23450;&#20041;&#34892;&#20026;</i>&#65292;&#26080;&#35770;&#19981;&#35843;&#29992;&#27966;&#29983;&#30340;&#26512;&#26500;&#20989;&#25968;&#26102;&#26159;&#21542;&#20250;&#23548;&#33268;&#36164;&#28304;&#27844;&#28431;<span class="t-rev-inl t-since-cxx20"><span>&#65292;&#38500;&#38750;&#36873;&#25321;&#30340;&#35299;&#20998;&#37197;&#20989;&#25968;&#26159;&#38144;&#27585;&#30340; <span class="t-lc"><a href="cpp-memory-new-operator_delete.html">operator delete</a></span></span> <span><span class="t-mark-rev t-since-cxx20">(C++20 &#36215;)</span></span></span>&#12290;</p>
<p>&#19968;&#26465;&#26377;&#29992;&#30340;&#26041;&#38024;&#26159;&#65292;&#20961;&#26159;&#24403;&#28041;&#21450; delete &#34920;&#36798;&#24335;<span class="t-rev-inl t-since-cxx11"><span>&#65292;&#20363;&#22914;&#22312; <span class="t-lc"><a href="cpp-memory-unique_ptr.html">std::unique_ptr</a></span> &#20013;&#38544;&#24335;&#20351;&#29992;</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 &#36215;)</span></span></span>&#26102;&#65292;&#20219;&#20309;&#22522;&#31867;&#30340;&#26512;&#26500;&#20989;&#25968;&#24517;&#39035;&#20026;<a rel="nofollow" class="external text" href="https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#discussion-make-base-class-destructors-public-and-virtual-or-protected-and-nonvirtual">&#20844;&#24320;&#19988;&#34394;&#65292;&#25110;&#21463;&#20445;&#25252;&#19988;&#38750;&#34394;</a>&#12290;</p>
<h3><span class="mw-headline" id=".E5.9C.A8.E6.9E.84.E9.80.A0.E5.92.8C.E6.9E.90.E6.9E.84.E6.9C.9F.E9.97.B4">&#22312;&#26500;&#36896;&#21644;&#26512;&#26500;&#26399;&#38388;</span></h3>
<p>&#24403;&#20174;&#26500;&#36896;&#20989;&#25968;&#25110;&#20174;&#26512;&#26500;&#20989;&#25968;&#20013;&#30452;&#25509;&#25110;&#38388;&#25509;&#35843;&#29992;&#34394;&#20989;&#25968;&#65288;&#21253;&#25324;&#22312;&#31867;&#30340;&#38750;&#38745;&#24577;&#25968;&#25454;&#25104;&#21592;&#30340;&#26500;&#36896;&#25110;&#26512;&#26500;&#26399;&#38388;&#65292;&#20363;&#22914;&#22312;&#25104;&#21592;<a href="cpp-language-initializer_list.html" class="mw-redirect">&#21021;&#22987;&#21270;&#22120;&#21015;&#34920;</a>&#20013;&#65289;&#65292;&#19988;&#23545;&#20854;&#23454;&#26045;&#35843;&#29992;&#30340;&#23545;&#35937;&#26159;&#27491;&#22312;&#26500;&#36896;&#25110;&#26512;&#26500;&#20013;&#30340;&#23545;&#35937;&#26102;&#65292;&#25152;&#35843;&#29992;&#30340;&#20989;&#25968;&#26159;&#26500;&#36896;&#20989;&#25968;&#25110;&#26512;&#26500;&#20989;&#25968;&#30340;&#31867;&#20013;&#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#65292;&#32780;&#38750;&#36827;&#19968;&#27493;&#30340;&#27966;&#29983;&#31867;&#20013;&#30340;&#35206;&#30422;&#20989;&#25968;&#12290; &#25442;&#35328;&#20043;&#65292;&#22312;&#26500;&#36896;&#21644;&#26512;&#26500;&#26399;&#38388;&#65292;&#36827;&#19968;&#27493;&#30340;&#27966;&#29983;&#31867;&#24182;&#19981;&#23384;&#22312;&#12290;</p>
<p>&#24403;&#26500;&#24314;&#20855;&#26377;&#22810;&#20010;&#20998;&#25903;&#30340;&#22797;&#26434;&#31867;&#26102;&#65292;&#22312;&#23646;&#20110;&#19968;&#20010;&#20998;&#25903;&#30340;&#26500;&#36896;&#20989;&#25968;&#20869;&#65292;&#22810;&#24577;&#34987;&#38480;&#21046;&#21040;&#35813;&#31867;&#21450;&#20854;&#22522;&#31867;&#65306;&#22914;&#26524;&#23427;&#33719;&#24471;&#20102;&#25351;&#21521;&#36825;&#20010;&#23376;&#23618;&#32423;&#20043;&#22806;&#30340;&#26576;&#20010;&#22522;&#31867;&#23376;&#23545;&#35937;&#30340;&#25351;&#38024;&#25110;&#24341;&#29992;&#24182;&#35797;&#22270;&#36827;&#34892;&#34394;&#20989;&#25968;&#35843;&#29992;&#65288;&#20363;&#22914;&#36890;&#36807;&#26174;&#24335;&#25104;&#21592;&#35775;&#38382;&#65289;&#65292;&#37027;&#20040;&#34892;&#20026;&#26410;&#23450;&#20041;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="cpp source-cpp">
<pre class="de1"><span class="kw1">struct</span> V <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> A <span class="sy4">:</span> <span class="kw1">virtual</span> V <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#22312; A &#20013;&#65292;V::f &#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#26159; A::f</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> B <span class="sy4">:</span> <span class="kw1">virtual</span> V <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#22312; B &#20013;&#65292;V::g &#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#26159; B::g</span>
B<span class="br0">(</span>V<span class="sy2">*</span>, A<span class="sy2">*</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="kw1">struct</span> D <span class="sy4">:</span> A, B <span class="br0">{</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#22312; D &#20013;&#65292;V::f &#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#26159; D::f</span>
<span class="kw1">virtual</span> <span class="kw4">void</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#22312; D &#20013;&#65292;V::g &#30340;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#26159; D::g</span>
<span class="co1">// &#27880;&#24847;&#65306;A &#22312; B &#20043;&#21069;&#21021;&#22987;&#21270;</span>
D<span class="br0">(</span><span class="br0">)</span> <span class="sy4">:</span> B<span class="br0">(</span><span class="br0">(</span>A<span class="sy2">*</span><span class="br0">)</span>this, this<span class="br0">)</span>
<span class="br0">{</span>
<span class="br0">}</span>
<span class="br0">}</span><span class="sy4">;</span>
<span class="co1">// B &#30340;&#26500;&#36896;&#20989;&#25968;&#65292;&#20174; D &#30340;&#26500;&#36896;&#20989;&#25968;&#35843;&#29992; </span>
B<span class="sy4">::</span><span class="me2">B</span><span class="br0">(</span>V<span class="sy2">*</span> v, A<span class="sy2">*</span> a<span class="br0">)</span>
<span class="br0">{</span>
f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#23545; V::f &#30340;&#34394;&#35843;&#29992;&#65288;&#23613;&#31649; D &#25317;&#26377;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;&#65292;D &#20063;&#19981;&#23384;&#22312;&#65289;</span>
g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#23545; B::g &#30340;&#34394;&#35843;&#29992;&#65292;&#22312; B &#20013;&#26159;&#26368;&#32456;&#35206;&#30422;&#20989;&#25968;</span>
v<span class="sy2">-</span><span class="sy1">&gt;</span>g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// v &#30340;&#31867;&#22411; V &#26159; B &#30340;&#22522;&#31867;&#65292;&#34394;&#35843;&#29992;&#20687;&#20043;&#21069;&#19968;&#26679;&#35843;&#29992; B::g</span>
a<span class="sy2">-</span><span class="sy1">&gt;</span>f<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// a &#30340;&#31867;&#22411; A &#19981;&#26159; B &#30340;&#22522;&#31867;&#65292;&#23427;&#23646;&#20110;&#23618;&#32423;&#20013;&#30340;&#19981;&#21516;&#20998;&#25903;&#12290;</span>
<span class="co1">// &#23581;&#35797;&#36890;&#36807;&#36825;&#20010;&#20998;&#25903;&#36827;&#34892;&#34394;&#35843;&#29992;&#23548;&#33268;&#26410;&#23450;&#20041;&#34892;&#20026;&#65292;</span>
<span class="co1">// &#21363;&#20351;&#27492;&#26102; A &#24050;&#23436;&#25104;&#26500;&#36896;</span>
<span class="co1">// &#65288;&#23427;&#22312; B &#20043;&#21069;&#26500;&#36896;&#65292;&#22240;&#20026;&#23427;&#22312; D &#30340;&#22522;&#31867;&#21015;&#34920;&#20013;&#22312; B &#21069;&#38754;&#20986;&#29616;&#65289;</span>
<span class="co1">// &#23454;&#36341;&#20013;&#65292;&#23545; A::f &#30340;&#34394;&#35843;&#29992;&#20250;&#35797;&#22270;&#20351;&#29992; B &#30340;&#34394;&#25104;&#21592;&#20989;&#25968;&#34920;&#65292;</span>
<span class="co1">// &#22240;&#20026;&#23427;&#22312; B &#30340;&#26500;&#36896;&#26399;&#38388;&#26159;&#27963;&#36291;&#30340;</span>
<span class="br0">}</span></pre></div>
</div>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc">
<td colspan="2"><a href="cpp-language-derived_class.html">&#27966;&#29983;&#31867;&#19982;&#32487;&#25215;&#27169;&#24335;</a></td>
</tr>
<tr class="t-dsc">
<td><a href="cpp-language-override.html"><code>override</code> &#35828;&#26126;&#31526;</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
<td>&#26174;&#24335;&#35828;&#26126;&#26041;&#27861;&#35206;&#30422;&#21478;&#19968;&#26041;&#27861;</td>
</tr>
<tr class="t-dsc">
<td><a href="cpp-language-final.html"><code>final</code> &#35828;&#26126;&#31526;</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
<td>&#22768;&#26126;&#19981;&#33021;&#34987;&#35206;&#30422;&#30340;&#26041;&#27861;</td>
</tr>
</table>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>