2009-02-23 2 views
25

질문에 모두 정말 나와 있습니다. 구조체에서 클래스를 파생시킬 수 있습니까? 아니면 구조체를 포함하는 클래스를 만들고 복사 생성자와 = 연산자를 정의하여 둘 사이를 이동해야합니까?C++에서 구조체로부터 클래스를 파생시킬 수 있습니까?

+0

MFC의 클래스 CRect는 struct tagRECT, AFAICS에서 상속받습니다. – Constantin

+0

나의 나쁜 - 질문의 텍스트가 변경되었습니다. –

답변

33

C에서 struct은 (다른 기본 액세스 수준을 제외하고) class과 거의 비슷합니다. 그렇습니다.

struct A { 
// fields are public by default 
}; 

class B: public A { 
// fields are private by default 
}; 

나는 MFC에 익숙하지 해요,하지만 C 및 C++ API를 모두 유지하려는 시도처럼 보인다.

+0

고마워요. 나는 그것이 ok이었다라고 꽤 확신했다. 그러나 실제로 그것을 실제로 보지 않고 있었다. –

9

물론 있습니다. 상속과 관련하여 다른 점은 클래스를 정의하면 다른 클래스/구조체에서 private을 상속한다는 것입니다. 당신이 구조체를 정의하고 클래스 나 구조체에서 파생 경우, 기본적으로 공공 상속 될 것입니다 :

// the following two are equivalent except that one time class is 
// used and the other time struct 
struct f : g { }; 
class f : public g { }; 

당신이 C 구조체를 래핑하는 방법을 궁금해하는 경우 - 전 클래스에 구성원으로 그들을 포함 할 것 . C 구조체는 상속 될 수 없으므로 (C 구조체에서는 보호되거나 가상 소멸자가 아닌 것으로 간주됩니다.) 데이터를 수집하는 단순 집계입니다. 그리고 그것들을 멤버로 두는 것은 ("한 점에는 x와 y 좌표가 있습니다"와 같이) 그것들을 사용합니다.

C 구조체는 클래스에 노출되어서는 안되는 멤버도 노출합니다. 포함 (Containment)은 노출 된 내용과 get/set 함수가 아닌 내용을 정확하게 제어 할 수 있으며 포함 된 Naked C struct 객체에 대한 복사본이나 참조를 제공 할 수 있습니다.

7

예. 구조체에서 클래스를 파생시킬 수 있습니다. C++에서 구조체는 단순히 기본 액세스가 개인이 아닌 공용 인 클래스입니다. 비 virual 멤버 함수 및/또는 정적 함수 만 추가하는 구조체에서 클래스를 파생시키는 것은 C 스타일 API와의 호환성을 유지하면서 C++ 인터페이스를 제공하는 유용한 기술입니다.

이것은 정확히 C 구조체의 많은 부분에서 MFC가 사용하는 접근 방식입니다 (질문에 대한 내용과 반대 됨).

예를 들어 CRect 클래스는 struct tagRECT에서 공개적으로 파생됩니다 (보다 일반적으로 사용되는 이름 인 RECT는 struct tagRECT의 typededf입니다). struct tagRECT는 모든 데이터 멤버를 정의하고 CRect는 가상 멤버가 아닌 함수 만 추가하기 때문에 CRect와 RECT의 메모리 레이아웃은 동일합니다. RECT가 예상되는 모든 함수에 대해 CRect를 인수로 사용할 수 있으며 그 반대의 경우도 가능합니다.

관련 문제