2016년 3월 7일 월요일

[c++] virtual 특성의 상속

 virtual 특성의 상속
 앞서 우리는 오버라이딩이란 무엇인지 알아 보았다. 그 중 virtual 이라는 키워드를 잠깐 알아 봤는데, 한가지 빼먹은 것이 있었다. 바로 오버라이딩에서의 virtual의 특징은 그것의 특성도 상속된다는 것이다. 
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class AAA  
  5. {  
  6. public:  
  7.     virtual void fct(){  
  8.         cout<<"AAA"<<endl;  
  9.     }  
  10. };  
  11.   
  12. class BBB : public AAA  
  13. {  
  14. public:  
  15.     void fct(){      
  16.         cout<<"BBB"<<endl;  
  17.     }  
  18. };  
  19.   
  20. class CCC : public BBB  
  21. {  
  22. public:  
  23.     void fct(){  
  24.         cout<<"CCC"<<endl;  
  25.     }  
  26. };  
  27.   
  28.   
  29. int main(void)  
  30. {  
  31.     BBB* b=new CCC;  
  32.     b->fct();  
  33.   
  34.     AAA* a=b;  
  35.     a->fct();  
  36.   
  37.     delete b;  
  38.     return 0;  
  39. }  
  위의 소스코드에서 BBB 클래스가 상속하고 있는 AAA 클래스의 Virtual void fct함수가 B클래스의 fct 함수에 의해서 오버라이딩 되어 지고 있다. 이 경우 오버라이딩을 하는 BBB 클래스의 fct 함수도 자동으로 virtual 키워드가 들어가게 된다. (명시적으로 써주나 안써주나 똑같지만, 코드의 가독성을 위해 써주는 것이 좋다. )
  1. class BBB : public AAA  
  2. {  
  3. public:  
  4.     virtual void fct(){      
  5.         cout<<"BBB"<<endl;  
  6.     }  
  7. };  
 C클래스도 마찬가지이다.아래와 같이 써주자. 
  1. class CCC : public BBB  
  2. {  
  3. public:  
  4.     virtual void fct(){  
  5.         cout<<"CCC"<<endl;  
  6.     }  
  7. };  
이것을 실행하면 어떤 결과를 출력하느냐? 앞서 오버라이팅 포스팅 부분에서도 언급했듯이 아래와 같은 결과를 출력하는것을 알 수 있다.

 만약 BBB,CCC 클래스가 없다고 가정할 경우를 생각해보자. AAA클래스만 있다고 하면, virtual은 의미를 가지지 않는다. virtual이라는 키워드는 오버라이딩 관계에 의해 상속되어질때만 의미를 지니기 때문이다. 

댓글 없음:

댓글 쓰기

[Effective C++] 항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자.

인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별 최적화를 걸기가 용이해집니다. 인라인 함수의 아이디어는  함수 호출문을 그 함수의 본문으로 바꿔치기하자는 것  남발했다가는 코드의 크기가 커질 게 뻔하다. 인라인 함수로 부풀려진 ...