2013-07-14 2 views
1

기존 클래스의 컨텍스트에서 변경하지 않고 기존 클래스에 고유 메서드를 추가하려면 어떻게합니까? 예를 들어클래스에 메서드를 추가하는 방법 (도우미 함수)?

:

A.hpp 
     class A 
     { 
     public : 
     void print1() 
     { 
      cout << "print1"; 
     } 
     }; 

    B.hpp 
     //add a helper function to class A 
     //for example: 
     A::print2() 
     { 
     cout << "print2"; 
     } 

    main.cpp 

     #include "A.hpp" 
     #include "B.hpp" 
     main() 
     { 
      A a1; 
      a1.print2(); 
     } 
+2

임무 불가능 – oldmonk

+1

아니요, C++에 없음 –

+0

[상속] (http://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29)? [작문] (http://en.wikipedia.org/wiki/Object_composition)? –

답변

4

는, C++의 클래스를 확장 이가지 경우를 구별 할 수 있습니다. 새로운 기능이 현재 인터페이스로 표현 될 수 있다면

사용 비 멤버 함수 새로운 기능이 현재의 구현에 대한 지식을 요구하는 경우

// B.hpp 
void print2(A const& a) 
{ 
    // pre-call extensions (logging, checking etc.) 
    a.print1(); 
    // post-call extensions (logging, checking etc.) 
} 

사용 클래스 상속

// B.hpp 
// WARNING: here be dragons, read on before using this in production code 
class B: public A 
{ 
public: 
    void print2() const // compiler-generated signature: void print2(B const*) 
    { 
     // pre-call extensions (logging, checking etc.) 
     print1(); 
     // post-call extensions (logging, checking etc.) 
    } 
}; 

그러나 기본 클래스가 아니었던 클래스에서 파생되면 위험 할 수 있습니다. 특히 Avirtual 소멸자가없는 경우 포인터를 사용하여 B 객체를 동적으로 할당하면 A 객체에 대한 포인터 인 것처럼 할당이 해제되는 위치에서 문제가 발생할 수 있습니다.

A::print1()virtual이 아니기 때문에 모든 종류의 이름 숨기기 문제가 발생합니다. 따라서 확장 기능 이름을 B::print2()으로 지정해야합니다.

길게만 짧게 : 어떤 종류의 수업을 쓰는지 알고 있습니다. 클래스 구현을 기반으로 비헤이비어를 확장하려면 기본 클래스 (가상 소멸자, 재정의 할 수있는 가상 함수)로 적합하게 만드는 것이 좋습니다. 그렇지 않으면 클래스를 final (새로운 C++ 11 상황 별 키워드)으로 표시하십시오. 기존 함수를 재정의하려고하면 컴파일러 경고가 생성됩니다.

참고 : 다른 언어 (특히 D)에서, 구문 a.print2()을 볼 때 컴파일러는 자동으로 비 멤버 함수 print2(a)을 찾을 수있다. 불행히도 이러한 유니폼 함수 호출 구문은 아직 C++의 로드맵에 포함되어 있지 않습니다.

+1

델파이 컴파일러에서 클래스의 능력을 증가시킬 필요가있을 때 (소스가없는 경우) 우리는 클래스에 대한 도우미 함수를 작성할 수 있습니다.이 도우미 함수는 정적 함수와 유사하며 공용 속성에 액세스 할 수 있습니다. –

+0

이 답변은 매우 긴 형태의 "아니오"이지만 +1입니다. – einpoklum

관련 문제