2011-12-01 4 views
2

저는 C++을 처음 접했고 Java로 1 년 동안 코딩했습니다. C++에서 인터페이스와 추상 클래스 모두에 해당하는 것은 추상 클래스뿐입니다. 공장 설계를하는 동안 장애가 될 수 있습니까? 상속하는 클래스에 메소드를 정의하는 것을 생략하고 싶은 경우가 많습니다.이를 시행하고 싶습니다. 이 같은 정의하면C++ 추상 클래스

+3

C++의 어떤 것도 핸디캡이 아닙니다. –

답변

8

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++에서 할 수있는 일을 생각할 수 없으므로 실제로는 핸디캡이 아닙니다.

+0

나는 완전한 C++ 놈이다. 어쩌면 나는 모든 것을 올바르게 이해하지 못할 수도 있습니다. 나에게이 "인터페이스"는 추상 클래스와 유사 해 보이며 Java의 추상 클래스에도 필드가있을 수 있습니다. (예 :'int member;'와 비슷하다.) 모두 Java의 추상 클래스에서 추상 메소드처럼 보인다. 그러나 추상 클래스는 인터페이스와 다릅니다. –

+0

그냥 정확해야합니다 : 클래스 생성자를 상속하는 public (!)'member'를'thing_interface'classe의 멤버로 초기화 할 수 있다고 생각하지 않습니다. 아니면 내가 틀렸어? – azf

+1

@Fatal : 예, C++의 추상 클래스는 Java의 추상 클래스와 매우 유사합니다. 그러나 C++에는 별도의 "인터페이스"개념이 없으므로 Java에서 인터페이스를 사용하는 추상 클래스를 사용합니다. 인터페이스가되기를 원한다면 데이터 멤버 나 비 순수 가상 함수를 넣지 않아도됩니다. –

10

당신은 당신이 원하는 것을 가질 수 있습니다

class A { 
    public: 
    virtual void pure_virtual(int param1) = 0; 
    virtual ~A() { }; 
}; 

편집 : 감사 니콜라이와 마이크를!

+5

하나의 중요한 생략 - 가상 소멸자를 추가해야합니다. –

+2

일반적으로 소멸자가 * 순수 * 가상 (그냥 가상)이 아니길 원합니다.그것은 순수한 것이 든 아니든간에 구현이 필요하며, 클래스 정의 인'virtual ~ A() {}'에서 정의하는 것이 가장 간단합니다. –

1

인터페이스/추상 클래스의 측면에서 당신은 핸디캡을 느끼지 않을 것입니다. 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

나와 같은 자바 배경을 가진 사람에게 가장 잘 설명되어 있습니다. –