é¦å
ï¼å¼ºè°ä¸ä¸ªæ¦å¿µ
å®ä¹ä¸ä¸ªå½æ°ä¸ºèå½æ°ï¼ä¸ä»£è¡¨å½æ°ä¸ºä¸è¢«å®ç°çå½æ°ã
å®ä¹ä»ä¸ºèå½æ°æ¯ä¸ºäºå
许ç¨åºç±»çæéæ¥è°ç¨åç±»çè¿ä¸ªå½æ°ã
å®ä¹ä¸ä¸ªå½æ°ä¸ºçº¯èå½æ°ï¼æ代表å½æ°æ²¡æ被å®ç°ã
å®ä¹çº¯èå½æ°æ¯ä¸ºäºå®ç°ä¸ä¸ªæ¥å£ï¼èµ·å°ä¸ä¸ªè§èçä½ç¨ï¼è§è继æ¿è¿ä¸ªç±»çç¨åºåå¿
é¡»å®ç°è¿ä¸ªå½æ°ã
1ãç®ä»
å设æ们æä¸é¢çç±»å±æ¬¡ï¼
class A
{
public:
virtual void foo()
{
cout<<"A::foo() is called"<<endl;
}
};
class B:public A
{
public:
void foo()
{
cout<<"B::foo() is called"<<endl;
}
};
int main(void)
{
A *a = new B();
a->foo(); // å¨è¿éï¼aè½ç¶æ¯æåAçæéï¼ä½æ¯è¢«è°ç¨çå½æ°(foo)å´æ¯Bç!
return 0;
}
è¿ä¸ªä¾åæ¯èå½æ°çä¸ä¸ªå
¸ååºç¨ï¼éè¿è¿ä¸ªä¾åï¼ä¹è®¸ä½ 就对èå½æ°æäºä¸äºæ¦å¿µãå®èå°±èå¨æè°âæ¨è¿èç¼âæè
âå¨æèç¼âä¸ï¼ä¸ä¸ªç±»å½æ°çè°ç¨å¹¶ä¸æ¯å¨ç¼è¯æ¶å»è¢«ç¡®å®çï¼èæ¯å¨è¿è¡æ¶å»è¢«ç¡®å®çãç±äºç¼å代ç çæ¶å并ä¸è½ç¡®å®è¢«è°ç¨çæ¯åºç±»çå½æ°è¿æ¯åªä¸ªæ´¾çç±»çå½æ°ï¼æ以被æ为âèâå½æ°ã
èå½æ°åªè½åå©äºæéæè
å¼ç¨æ¥è¾¾å°å¤æçææã
C++纯èå½æ°
ä¸ãå®ä¹
ã纯èå½æ°æ¯å¨åºç±»ä¸å£°æçèå½æ°ï¼å®å¨åºç±»ä¸æ²¡æå®ä¹ï¼ä½è¦æ±ä»»ä½æ´¾çç±»é½è¦å®ä¹èªå·±çå®ç°æ¹æ³ãå¨åºç±»ä¸å®ç°çº¯èå½æ°çæ¹æ³æ¯å¨å½æ°åååå â=0â
ãvirtual void funtion1()=0
äºãå¼å
¥åå
ãã1ã为äºæ¹ä¾¿ä½¿ç¨å¤æç¹æ§ï¼æ们常常éè¦å¨åºç±»ä¸å®ä¹èæå½æ°ã
ãã2ãå¨å¾å¤æ
åµä¸ï¼åºç±»æ¬èº«çæ对象æ¯ä¸åæ
ççãä¾å¦ï¼å¨ç©ä½ä¸ºä¸ä¸ªåºç±»å¯ä»¥æ´¾çåºèèãåéçåç±»ï¼ä½å¨ç©æ¬èº«çæ对象ææ¾ä¸å常çã
ãã为äºè§£å³ä¸è¿°é®é¢ï¼å¼å
¥äºçº¯èå½æ°çæ¦å¿µï¼å°å½æ°å®ä¹ä¸ºçº¯èå½æ°ï¼æ¹æ³ï¼virtual ReturnType Function()= 0;ï¼ï¼åç¼è¯å¨è¦æ±å¨æ´¾çç±»ä¸å¿
é¡»äºä»¥éå以å®ç°å¤ææ§ãåæ¶å«æ纯èæå½æ°ç类称为æ½è±¡ç±»ï¼å®ä¸è½çæ对象ãè¿æ ·å°±å¾å¥½å°è§£å³äºä¸è¿°ä¸¤ä¸ªé®é¢ã
声æäºçº¯èå½æ°çç±»æ¯ä¸ä¸ªæ½è±¡ç±»ãæ以ï¼ç¨æ·ä¸è½å建类çå®ä¾ï¼åªè½å建å®çæ´¾çç±»çå®ä¾ã
纯èå½æ°ææ¾èçç¹å¾æ¯ï¼å®ä»¬å¿
é¡»å¨ç»§æ¿ç±»ä¸éæ°å£°æå½æ°ï¼ä¸è¦åé¢çï¼0ï¼å¦å该派çç±»ä¹ä¸è½å®ä¾åï¼ï¼èä¸å®ä»¬å¨æ½è±¡ç±»ä¸å¾å¾æ²¡æå®ä¹ã
å®ä¹çº¯èå½æ°çç®çå¨äºï¼ä½¿æ´¾çç±»ä»
ä»
åªæ¯ç»§æ¿å½æ°çæ¥å£ã
纯èå½æ°çæä¹ï¼è®©ææç类对象ï¼ä¸»è¦æ¯æ´¾ç类对象ï¼é½å¯ä»¥æ§è¡çº¯èå½æ°çå¨ä½ï¼ä½ç±»æ æ³ä¸ºçº¯èå½æ°æä¾ä¸ä¸ªåçç缺çå®ç°ãæ以类纯èå½æ°ç声æå°±æ¯å¨åè¯åç±»ç设计è
ï¼âä½ å¿
é¡»æä¾ä¸ä¸ªçº¯èå½æ°çå®ç°ï¼ä½æä¸ç¥éä½ ä¼ææ ·å®ç°å®âã
æ½è±¡ç±»çä»ç»
æ½è±¡ç±»æ¯ä¸ç§ç¹æ®çç±»ï¼å®æ¯ä¸ºäºæ½è±¡å设计çç®ç为建ç«çï¼å®å¤äºç»§æ¿å±æ¬¡ç»æçè¾ä¸å±ã
ï¼1ï¼æ½è±¡ç±»çå®ä¹ï¼ 称带æ纯èå½æ°ç类为æ½è±¡ç±»ã
ï¼2ï¼æ½è±¡ç±»çä½ç¨ï¼
æ½è±¡ç±»ç主è¦ä½ç¨æ¯å°æå
³çæä½ä½ä¸ºç»ææ¥å£ç»ç»å¨ä¸ä¸ªç»§æ¿å±æ¬¡ç»æä¸ï¼ç±å®æ¥ä¸ºæ´¾çç±»æä¾ä¸ä¸ªå
Œ
±çæ ¹ï¼æ´¾çç±»å°å
·ä½å®ç°å¨å
¶åºç±»ä¸ä½ä¸ºæ¥å£çæä½ãæ以派çç±»å®é
ä¸å»ç»äºä¸ç»åç±»çæä½æ¥å£çéç¨è¯ä¹ï¼è¿äºè¯ä¹ä¹ä¼ ç»åç±»ï¼åç±»å¯ä»¥å
·ä½å®ç°è¿äºè¯ä¹ï¼ä¹å¯ä»¥åå°è¿äºè¯ä¹ä¼ ç»èªå·±çåç±»ã
ï¼3ï¼ä½¿ç¨æ½è±¡ç±»æ¶æ³¨æï¼
• æ½è±¡ç±»åªè½ä½ä¸ºåºç±»æ¥ä½¿ç¨ï¼å
¶çº¯èå½æ°çå®ç°ç±æ´¾çç±»ç»åºãå¦ææ´¾çç±»ä¸æ²¡æéæ°å®ä¹çº¯èå½æ°ï¼èåªæ¯ç»§æ¿åºç±»ç纯èå½æ°ï¼åè¿ä¸ªæ´¾çç±»ä»ç¶è¿æ¯ä¸ä¸ªæ½è±¡ç±»ãå¦ææ´¾çç±»ä¸ç»åºäºåºç±»çº¯èå½æ°çå®ç°ï¼å该派ç类就ä¸åæ¯æ½è±¡ç±»äºï¼å®æ¯ä¸ä¸ªå¯ä»¥å»ºç«å¯¹è±¡çå
·ä½çç±»ã
• æ½è±¡ç±»æ¯ä¸è½å®ä¹å¯¹è±¡çã
æ»ç»ï¼
1ã纯èå½æ°å£°æå¦ä¸ï¼ virtual void funtion1()=0; 纯èå½æ°ä¸å®æ²¡æå®ä¹ï¼çº¯èå½æ°ç¨æ¥è§èæ´¾çç±»çè¡ä¸ºï¼å³æ¥å£ãå
å«çº¯èå½æ°çç±»æ¯æ½è±¡ç±»ï¼æ½è±¡ç±»ä¸è½å®ä¹å®ä¾ï¼ä½å¯ä»¥å£°ææåå®ç°è¯¥æ½è±¡ç±»çå
·ä½ç±»çæéæå¼ç¨ã
2ãèå½æ°å£°æå¦ä¸ï¼virtual ReturnType FunctionName(Parameter)ï¼èå½æ°å¿
é¡»å®ç°ï¼å¦æä¸å®ç°ï¼ç¼è¯å¨å°æ¥éï¼é误æ示为ï¼
error LNK****: unresolved external symbol "public: virtual void __thiscall ClassName::virtualFunctionName(void)"
3ã对äºèå½æ°æ¥è¯´ï¼ç¶ç±»ååç±»é½æåèªççæ¬ãç±å¤ææ¹å¼è°ç¨çæ¶åå¨æç»å®ã
4ãå®ç°äºçº¯èå½æ°çåç±»ï¼è¯¥çº¯èå½æ°å¨åç±»ä¸å°±ç¼ç¨äºèå½æ°ï¼åç±»çåç±»å³ååç±»å¯ä»¥è¦ç该èå½æ°ï¼ç±å¤ææ¹å¼è°ç¨çæ¶åå¨æç»å®ã
5ãèå½æ°æ¯C++ä¸ç¨äºå®ç°å¤æ(polymorphism)çæºå¶ãæ ¸å¿ç念就æ¯éè¿åºç±»è®¿é®æ´¾çç±»å®ä¹çå½æ°ã
6ãå¨æå¨æåé
å ä¸å
åçæ¶åï¼ææå½æ°å¿
é¡»æ¯èå½æ°ï¼ä½æ²¡æå¿
è¦æ¯çº¯èçã
7ãåå
ä¸æ¯æåå½æ°ï¼åªææåå½æ°æå¯ä»¥æ¯èæçï¼å æ¤åå
ä¸è½æ¯èæå½æ°ãä½å¯ä»¥éè¿è®©åå
å½æ°è°ç¨èææåå½æ°æ¥è§£å³åå
çèæé®é¢ã
8ãææå½æ°åºå½æ¯èå½æ°ï¼å°è°ç¨ç¸åºå¯¹è±¡ç±»åçææå½æ°ï¼å æ¤ï¼å¦ææéæåçæ¯å类对象ï¼å°è°ç¨åç±»çææå½æ°ï¼ç¶åèªå¨è°ç¨åºç±»çææå½æ°ã
æ纯èå½æ°çç±»æ¯æ½è±¡ç±»ï¼ä¸è½çæ对象ï¼åªè½æ´¾çãä»æ´¾ççç±»ç纯èå½æ°æ²¡æ被æ¹åï¼é£ä¹ï¼å®çæ´¾çç±»è¿æ¯ä¸ªæ½è±¡ç±»ã
å®ä¹çº¯èå½æ°å°±æ¯ä¸ºäºè®©åºç±»ä¸å¯å®ä¾åå
å 为å®ä¾åè¿æ ·çæ½è±¡æ°æ®ç»ææ¬èº«å¹¶æ²¡ææä¹ã
æè
ç»åºå®ç°ä¹æ²¡ææä¹
å®é
ä¸æ个人认为纯èå½æ°çå¼å
¥ï¼æ¯åºäºä¸¤ä¸ªç®ç
1ã为äºå®å
¨ï¼å 为é¿å
ä»»ä½éè¦æç¡®ä½æ¯å 为ä¸å°å¿è导è´çæªç¥çç»æï¼æéåç±»å»ååºåçå®ç°ã
2ã为äºæçï¼ä¸æ¯ç¨åºæ§è¡çæçï¼èæ¯ä¸ºäºç¼ç çæçã
温馨提示:答案为网友推荐,仅供参考