는, 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.)
}
};
그러나 기본 클래스가 아니었던 클래스에서 파생되면 위험 할 수 있습니다. 특히 A
에 virtual
소멸자가없는 경우 포인터를 사용하여 B
객체를 동적으로 할당하면 A
객체에 대한 포인터 인 것처럼 할당이 해제되는 위치에서 문제가 발생할 수 있습니다.
A::print1()
이 virtual
이 아니기 때문에 모든 종류의 이름 숨기기 문제가 발생합니다. 따라서 확장 기능 이름을 B::print2()
으로 지정해야합니다.
길게만 짧게 : 어떤 종류의 수업을 쓰는지 알고 있습니다. 클래스 구현을 기반으로 비헤이비어를 확장하려면 기본 클래스 (가상 소멸자, 재정의 할 수있는 가상 함수)로 적합하게 만드는 것이 좋습니다. 그렇지 않으면 클래스를 final
(새로운 C++ 11 상황 별 키워드)으로 표시하십시오. 기존 함수를 재정의하려고하면 컴파일러 경고가 생성됩니다.
참고 : 다른 언어 (특히 D)에서, 구문 a.print2()
을 볼 때 컴파일러는 자동으로 비 멤버 함수 print2(a)
을 찾을 수있다. 불행히도 이러한 유니폼 함수 호출 구문은 아직 C++의 로드맵에 포함되어 있지 않습니다.
임무 불가능 – oldmonk
아니요, C++에 없음 –
[상속] (http://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29)? [작문] (http://en.wikipedia.org/wiki/Object_composition)? –