저는 C++을 처음 접했고 Java로 1 년 동안 코딩했습니다. C++에서 인터페이스와 추상 클래스 모두에 해당하는 것은 추상 클래스뿐입니다. 공장 설계를하는 동안 장애가 될 수 있습니까? 상속하는 클래스에 메소드를 정의하는 것을 생략하고 싶은 경우가 많습니다.이를 시행하고 싶습니다. 이 같은 정의하면C++ 추상 클래스
답변
Java 인터페이스는 C++ 추상 클래스로 변환하는 것이 가장 좋습니다. Java에서 (내가 아는 한) 인터페이스는 어쨌든 모든 클래스에서 C++가 갖고있는 "다중 상속"을 허용한다는 점을 제외하고는 인터페이스는 추상 클래스의 서브 세트 일뿐입니다.
class thing_interface {
public:
virtual ~thing_interface() {}
virtual void foo() =0; //pure virtual function
};
class other_interface {
public:
virtual ~other_interface() {}
virtual void bar() =0; //pure virtual function
};
class thing_impl : public thing_interface, public other_interface {
protected:
int member;
public:
thing_impl() : member(0) {}
virtual ~thing_impl() {};
virtual void foo() { std::cout << "FOO!\n";}
virtual void bar() { std::cout << "BAR!\n";}
};
=0
구문은 인터페이스에서 정의되어 있지 않은 것을 의미하지만 는 인터페이스를 충족 클래스 정의되어야한다. 가상 함수가있는 경우 거의 항상 가상 소멸자도 필요합니다. 구현 기능이 없으므로 C++은 thing_interface
을 단독으로 만들려고하면 오류를 표시합니다.
Java가 C++에서 할 수있는 일을 생각할 수 없으므로 실제로는 핸디캡이 아닙니다.
나는 완전한 C++ 놈이다. 어쩌면 나는 모든 것을 올바르게 이해하지 못할 수도 있습니다. 나에게이 "인터페이스"는 추상 클래스와 유사 해 보이며 Java의 추상 클래스에도 필드가있을 수 있습니다. (예 :'int member;'와 비슷하다.) 모두 Java의 추상 클래스에서 추상 메소드처럼 보인다. 그러나 추상 클래스는 인터페이스와 다릅니다. –
그냥 정확해야합니다 : 클래스 생성자를 상속하는 public (!)'member'를'thing_interface'classe의 멤버로 초기화 할 수 있다고 생각하지 않습니다. 아니면 내가 틀렸어? – azf
@Fatal : 예, C++의 추상 클래스는 Java의 추상 클래스와 매우 유사합니다. 그러나 C++에는 별도의 "인터페이스"개념이 없으므로 Java에서 인터페이스를 사용하는 추상 클래스를 사용합니다. 인터페이스가되기를 원한다면 데이터 멤버 나 비 순수 가상 함수를 넣지 않아도됩니다. –
당신은 당신이 원하는 것을 가질 수 있습니다
class A {
public:
virtual void pure_virtual(int param1) = 0;
virtual ~A() { };
};
편집 : 감사 니콜라이와 마이크를!
하나의 중요한 생략 - 가상 소멸자를 추가해야합니다. –
일반적으로 소멸자가 * 순수 * 가상 (그냥 가상)이 아니길 원합니다.그것은 순수한 것이 든 아니든간에 구현이 필요하며, 클래스 정의 인'virtual ~ A() {}'에서 정의하는 것이 가장 간단합니다. –
인터페이스/추상 클래스의 측면에서 당신은 핸디캡을 느끼지 않을 것입니다. C++ 순수 가상 함수와 추상 클래스에 대해 읽어야합니다.
는 C++의 인터페이스를 위해, 여기에 sudo를 코드 :class MyInterface {
virtual void func1() = 0;
virtual int func2(int x, int y) = 0;
}
class MyAnotherInterface {
virtual void func3() = 0;
virtual int func4(int x, int y) = 0;
}
는 C++의 추상 클래스를하려면, 여기에 sudo를 코드입니다. 위 인터페이스에서 하나의 함수 만 구현한다는 것을 알 수 있습니다. 따라서 인스턴스를 만들 수 없습니다.
class MyAbstract : public MyIterface {
void func1() {
printf("in func1");
}
}
이제 실제 구체적인 클래스 :
class MyConcreteClass : public MyAbstract, public MyAnotherIterface {
int func2(int x, int y) {
printf("func2 x=%x,y=%y",x,y);
}
void func3() {
printf("in func3");
}
int func4(int x, int y) {
printf("func4 x=%x,y=%y",x,y);
}
}
내가 MyConcreteClass을 위해 사용하고 당신이 다중 상속을 사용하는 몇 가지 문제가 있습니다. 그러나 멤버 변수가있는 기본 클래스가 하나 뿐이고 다른 기본 클래스가 순수 가상 함수 만 포함하면이 패턴은 Java와 똑같이 작동합니다. 일부 메서드와 멤버 변수를 포함하는 클래스는 extends
으로 매핑되고 순수 가상 함수 만 포함하는 다른 클래스는 `구현 '합니다. 우리의 예에서
은 자바 해당 코드는 장애인
자바에서 오는 때 제네릭 인 장애를 느끼는 유일한 장소를 공급
class MyConcreteClass extends MyAbstract implements MyAnotherInterface {
public int func2(int x, int y) {
System.out.print(String.format("func2 x=%x,y=%y",x,y));
}
public void func3() {
System.out.print("in func3");
}
public int func4(int x, int y) {
System.out.print(String.format("func4 x=%x,y=%y",x,y));
}
}
입니다. C++에는 템플릿이 있지만 심각한 한계가 있습니다.
나와 같은 자바 배경을 가진 사람에게 가장 잘 설명되어 있습니다. –
- 1. C++ 추상 클래스 템플릿
- 2. C++ 추상 클래스
- 3. C++의 추상 클래스
- 4. 추상 메서드가없는 C#의 추상 클래스
- 5. 추상 메서드가없는 추상 클래스
- 6. 추상 클래스에서 클래스 파생 (C++)
- 7. C# 인터페이스 및 추상 클래스
- 8. 추상 클래스 대 클래스
- 9. 추상 클래스 매개 변수를 사용하여 추상 메서드가있는 Java 추상 클래스
- 10. 추상 클래스
- 11. 나는 추상 클래스가 추상 클래스
- 12. 다중 상속 추상 클래스
- 13. C에서 추상 클래스 확장하기 #
- 14. 인터페이스와 추상 클래스
- 15. 추상 클래스 생성자
- 16. 추상 클래스 캐스트 연산자
- 17. 일부 구현 된 C++ 추상 클래스
- 18. 부분 메서드 내 추상 클래스 (C#)
- 19. C#을 추상 클래스 일반적인 특성은
- 20. C++ 추상 기본 클래스 전용 멤버
- 21. 추상 클래스 인라인의 C# 구현을 작성 하시겠습니까?
- 22. C++ 추상 클래스 생성 및 소멸
- 23. C# deserialize 알 수없는 추상 클래스
- 24. C# 인터페이스/추상 클래스 (동적 유형 포함)
- 25. C++/CLI XML XmlObjectSerializer 추상 클래스
- 26. C++ 추상 기본 클래스 및 상속
- 27. C#의 추상 클래스 및 메소드
- 28. 내가 추상 클래스 메소드가 C#을
- 29. 오류 LNK2019 추상 클래스
- 30. 템플릿에서 상속 추상 클래스
C++의 어떤 것도 핸디캡이 아닙니다. –