질문에 모두 정말 나와 있습니다. 구조체에서 클래스를 파생시킬 수 있습니까? 아니면 구조체를 포함하는 클래스를 만들고 복사 생성자와 = 연산자를 정의하여 둘 사이를 이동해야합니까?C++에서 구조체로부터 클래스를 파생시킬 수 있습니까?
답변
C에서 struct
은 (다른 기본 액세스 수준을 제외하고) class
과 거의 비슷합니다. 그렇습니다.
struct A {
// fields are public by default
};
class B: public A {
// fields are private by default
};
나는 MFC에 익숙하지 해요,하지만 C 및 C++ API를 모두 유지하려는 시도처럼 보인다.
고마워요. 나는 그것이 ok이었다라고 꽤 확신했다. 그러나 실제로 그것을 실제로 보지 않고 있었다. –
물론 있습니다. 상속과 관련하여 다른 점은 클래스를 정의하면 다른 클래스/구조체에서 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 객체에 대한 복사본이나 참조를 제공 할 수 있습니다.
예. 구조체에서 클래스를 파생시킬 수 있습니다. C++에서 구조체는 단순히 기본 액세스가 개인이 아닌 공용 인 클래스입니다. 비 virual 멤버 함수 및/또는 정적 함수 만 추가하는 구조체에서 클래스를 파생시키는 것은 C 스타일 API와의 호환성을 유지하면서 C++ 인터페이스를 제공하는 유용한 기술입니다.
이것은 정확히 C 구조체의 많은 부분에서 MFC가 사용하는 접근 방식입니다 (질문에 대한 내용과 반대 됨).
예를 들어 CRect 클래스는 struct tagRECT에서 공개적으로 파생됩니다 (보다 일반적으로 사용되는 이름 인 RECT는 struct tagRECT의 typededf입니다). struct tagRECT는 모든 데이터 멤버를 정의하고 CRect는 가상 멤버가 아닌 함수 만 추가하기 때문에 CRect와 RECT의 메모리 레이아웃은 동일합니다. RECT가 예상되는 모든 함수에 대해 CRect를 인수로 사용할 수 있으며 그 반대의 경우도 가능합니다.
- 1. 관리되지 않는 C++ 클래스에서 Managed C++ 클래스를 파생시킬 수 있습니까?
- 2. 통화 코드에서 통화 기호를 파생시킬 수 있습니까?
- 3. c에서 serialport 클래스를 사용할 수 있습니까?
- 4. 클래스를 전혀 파생시킬 수 없게 만드는 방법. 어떤 방법이 있니?
- 5. C 구조체로부터 PyBuffer 만들기
- 6. 설치 파일 이름을 실행 파일 버전 번호에서 파생시킬 수 있습니까?
- 7. c에서 readonly 클래스를 사용하여 디자인하기 #
- 8. C에서 메타 클래스를 구현하려면 어떻게해야합니까?
- 9. Objective C에서 CLHeading 개체를 만들 수 있습니까?
- 10. 예외 클래스 : C# (.Net)에서 파생시킬 때?
- 11. 수퍼 클래스를 변경할 수 있습니까?
- 12. Service 클래스를 꾸밀 수 있습니까?
- 13. 클래스를 포인터로 사용할 수 있습니까?
- 14. 다른 모든 함수를 파생시킬 수있는 함수는 무엇입니까?
- 15. Objective-C에서 중첩 클래스를 확장하는 좋은/최선의 방법이 있습니까?
- 16. Obj-C에서 주어진 클래스의 서브 클래스를 발견하십시오
- 17. 목록 <string>는 C에서 클래스를 전달할 수 없습니다 ++
- 18. 클래스가 두 개 이상의 클래스를 확장 할 수 있습니까?
- 19. C에서 가능하기 때문에 C에서 temeplatization을 달성 할 수 있습니까?
- 20. 객관적인 C에서 C++ 템플릿 클래스를 사용하는 방법
- 21. Objective-C에서 클래스를 동적으로로드하는 방법은 무엇입니까?
- 22. Objective C에서 ConstantList 클래스를 만드는 방법
- 23. JRuby에서 Java 클래스를 생성하고 Java 클래스를 사용할 수 있습니까?
- 24. 사용자가 c에서 프로그램을 다시 시작할 수 있습니까?
- 25. C에서 어떻게 FTGL에서 텍스트를 움직일 수 있습니까?
- 26. 어떻게 C에서 오디오를 녹음 할 수 있습니까?
- 27. C에서 음수 배열 색인을 사용할 수 있습니까?
- 28. C에서 문자열에 인수를 어떻게 연결할 수 있습니까?
- 29. opendir을 C에서 반복적으로 사용할 수 있습니까?
- 30. C에서 변수가 속한 유형을 찾을 수 있습니까?
MFC의 클래스 CRect는 struct tagRECT, AFAICS에서 상속받습니다. – Constantin
나의 나쁜 - 질문의 텍스트가 변경되었습니다. –