﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ks Home &#187; CShape</title>
	<atom:link href="http://www.ksarea.com/articles/category/cshape/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ksarea.com</link>
	<description>King和Sha的小窝</description>
	<lastBuildDate>Fri, 10 Sep 2010 03:39:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C# &amp; C++ 之比较&#8212;&#8212; 覆盖、隐藏</title>
		<link>http://www.ksarea.com/articles/20081231_compare_cshape_cplus_1.html</link>
		<comments>http://www.ksarea.com/articles/20081231_compare_cshape_cplus_1.html#comments</comments>
		<pubDate>Wed, 31 Dec 2008 05:18:32 +0000</pubDate>
		<dc:creator>sha</dc:creator>
				<category><![CDATA[CShape]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://www.ksarea.com/articles/20081231_compare_cshape_cplus_1.html</guid>
		<description><![CDATA[接触c＃不久，虽然c＃比c++ 操作起来要简单很多，但是还是十分渴望在实质上了解c＃的。先说说一些零散的东西，然后说说有关&#8220;类中的覆盖、隐藏&#8221;。

c＃中方法的修饰符method-modifier可以是： new、public、protected、internel、private、static、virtual、sealed、override、abstract、extern。其中abstract和extern修饰的方法是不允许有method-body的，直接在申明后面加个；结束。下面是一些零散的points：

抽象函数也是虚拟的，但是不能同时加上virtual关键字（加上后编译会报错），如果一个类中包含抽象函数，那么这个类就是抽象类，此类必须声明为抽象的（等于C++中：拥有纯虚函数的类是。。。类的概念一样，C++中需要在纯虚函数后面标记=0，但是c＃中只需要在前面加abstract修饰符）。 
重载：(待续) 
seal修饰的类是不允许被继承的，seal修饰的函数是不允许被重写的。 
c＃不支持私有继承（在C++中，私有继承是has-a的关系，公有继承是is-a的关系），C＃中默认的都是公有继承。c＃中，如果派生类要在重写基类的一个函数时，必须用override显示的声明。 

（上面的概念都比较的虚，还没有怎么实践过，实践了再回来记录一下。）
下面简单描述一下在类的继承中出现的 覆盖 和 隐藏。
public class baseClass    &#160;&#160;&#160; {     &#160;&#160;&#160;&#160;&#160;&#160;&#160; public virtual void F()     &#160;&#160;&#160;&#160;&#160;&#160;&#160; {     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&#34;this is baseClass&#34;);     &#160;&#160;&#160;&#160;&#160;&#160;&#160; }     &#160;&#160;&#160; } 
&#160;&#160;&#160; public class [...]]]></description>
			<content:encoded><![CDATA[<p>接触c＃不久，虽然c＃比c++ 操作起来要简单很多，但是还是十分渴望在实质上了解c＃的。先说说一些零散的东西，然后说说有关&#8220;类中的覆盖、隐藏&#8221;。</p>
<p><span id="more-219"></span></p>
<p>c＃中方法的修饰符method-modifier可以是： new、public、protected、internel、private、static、virtual、sealed、override、abstract、extern。其中abstract和extern修饰的方法是不允许有method-body的，直接在申明后面加个；结束。下面是一些零散的points：</p>
<ul>
<li>抽象函数也是虚拟的，但是不能同时加上virtual关键字（加上后编译会报错），如果一个类中包含抽象函数，那么这个类就是抽象类，此类必须声明为抽象的（等于C++中：拥有纯虚函数的类是。。。类的概念一样，C++中需要在纯虚函数后面标记=0，但是c＃中只需要在前面加abstract修饰符）。 </li>
<li>重载：(待续) </li>
<li>seal修饰的类是不允许被继承的，seal修饰的函数是不允许被重写的。 </li>
<li>c＃不支持私有继承（在C++中，私有继承是has-a的关系，公有继承是is-a的关系），C＃中默认的都是公有继承。c＃中，如果派生类要在重写基类的一个函数时，必须用override显示的声明。 </li>
</ul>
<p>（上面的概念都比较的虚，还没有怎么实践过，实践了再回来记录一下。）</p>
<p>下面简单描述一下在类的继承中出现的 覆盖 和 隐藏。</p>
<p>public class baseClass    <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public virtual void F()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;this is baseClass&quot;);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; public class deriveClass1:baseClass    <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public override void F()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;this is deriveClass1&quot;);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; public class deriveClass2:baseClass    <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public new void F()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;this is deriveClass2&quot;);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; public class test    <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public static void Main()     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; baseClass p1 = new deriveClass1();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; p1.F();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; deriveClass1 p2 = new deriveClass1();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; p2.F(); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; baseClass p3 = new deriveClass2();    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; p3.F(); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; deriveClass2 p4 = new deriveClass2();    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; p4.F();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; }</p>
<p>结果是：</p>
<p>this is deriveClass1    <br />this is deriveClass1     <br />this is baseClass     <br />this is deriveClass2</p>
<p>很明显：</p>
<p>覆盖：在deriveClass1的情况里：当基类函数是 virtual关键字修饰、派生类函数拥有相同签名并且是用override关键字修饰的时候，表明 此时是类似于c++ 中的 覆盖的关系（在派生类的虚函数列表里已经找不到基类的函数地址了，就是说不管是通过派生类对象/指针/引用、还是通过指向派生类的基类对象/指针/引用 都是无法访问到 基类部分的 此函数了）。</p>
<p>隐藏：在deriveClass2的情况里：当基类函数是 virtual关键字修饰（或没有任何关键字修饰）、派生类函数拥有相同签名并且是用new关键字修饰的（或者没有用任何关键字修饰）时候，表明 此时是类似于c++ 中的 隐藏的关系（若是派生类对象/指针/引用 就访问到的是派生类里定义的函数；若是 指向派生类的基类对象/指针/引用 就访问到的是基类里定义的函数）。一句话就是：如果相同的方法在基类和派生类中都进行了声明，但是该方法没有声明为virtual和override，那么派生类方法就会隐藏基类方法。</p>
<p>在不使用New关键字来隐藏基类方法也是可以的，编译器会出现一个警告，提示如果有意去隐藏基类的方法，请使用New关键字修饰。c＃中，使用new关键字就是表示我要隐藏基类的方法。</p>
<p>重载：(待续)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ksarea.com/articles/20081231_compare_cshape_cplus_1.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
