2010-01-27 5 views

답변

88

추상 클래스는 하나 이상의 메소드가 선언되었지만 정의되지 않은 클래스입니다. 즉 컴파일러는 이러한 메소드가 클래스의 일부이지만 해당 메소드에 대해 실행할 코드가 아님을 의미합니다. 이것을 추상적 인 메소드라고합니다. 다음은 추상 클래스의 예입니다.

class shape { 
public: 
    virtual void draw() = 0; 
}; 

이 클래스는 클래스가 구체적 일 경우 클래스의 자손이 draw 메서드를 구현하도록 지정하는 추상 클래스를 선언합니다. 어쨌든 abstract이기 때문에이 클래스를 인스턴스화 할 수 없다. 왜냐하면 컴파일러는 멤버 그리기를 호출했을 때 실행할 코드를 모를 것이다.

shape my_shape(); 
my_shape.draw(); 

가 실제로 그리기 메소드를 구현 할이 추상 클래스에서 클래스를 파생해야 그리기 방법을 사용 할 수 있으려면, 콘크리트 클래스를 만드는 : 그래서 다음을 수행 할 수 없습니다

왜 W를 것,

circle my_circle(40, 30, 10); 
rectangle my_rectangle(20, 10, 50, 15); 
my_circle.draw(); 
my_rectangle.draw(); 

지금은 물론 질문은 :

class circle : public shape { 
public: 
    circle(int x, int y, int radius) { 
    /* set up the circle */ 
    } 
    virtual draw() { 
    /* do stuff to draw the circle */ 
    } 
}; 

class rectangle : public shape { 
public: 
    rectangle(int min_x, int min_y, int max_x, int max_y) { 
    /* set up rectangle */ 
    } 
    virtual draw() { 
    /* do stuff to draw the rectangle */ 
    } 
}; 

지금 당신은 콘크리트 객체 원과 사각형을 인스턴스화과 무승부 방법을 사용할 수 있습니다 개미? 원과 직사각형 클래스를 정의하고 전체 모양 클래스를 제거한 것은 아닙니다. 하지만 당신은 상속을 이용할 수 없습니다.

std::vector<shape*> my_scene; 
my_scene.push_back(new circle(40, 30, 10)); 
my_scene.push_back(new rectangle(20, 10, 50, 15)); 
std::for_each(my_scene.begin(), my_scene.end(), std::mem_fun_ref(&shape::draw) 

이 코드는 모든 모양을 하나의 컨테이너로 모으겠습니다. 이렇게하면 장면에 많은 모양과 다양한 모양이있는 경우 훨씬 쉽게 처리 할 수 ​​있습니다. 예를 들어 이제는 모든 모양을 한 번에 그릴 수 있으며 이렇게하는 코드는 우리가 가진 다양한 모양에 대해 알 필요조차 없습니다.

이제 마지막으로 우리는 왜 우리가 정의하지 않은 형태의 그리기 기능, 즉 그냥 비어있는 기능, 추상적 인, 그리고 왜 알 필요가 :

class shape { 
public: 
    virtual void draw() { 
    /* do nothing */ 
    } 
}; 

그 이유는 그 우리 돈 어쨌든 실제 형태가 아니며 추상적 인 형태의 객체를 원합니다. 그리기 메소드의 구현을 정의하는 것은 의미가 없으므로 비어있는 경우에도 마찬가지입니다. 모양 클래스를 추상화하면 실수로 모양 클래스를 인스턴스화하거나 실수로 파생 클래스의 draw 함수 대신 기본 클래스의 빈 draw 함수를 호출 할 수 없습니다. 실제로 우리는 셰이프처럼 동작하고자하는 모든 클래스에 대한 인터페이스를 정의합니다. 우리는 그러한 클래스가 반드시 지정해야하는 것처럼 보이는 draw 메서드를 가져야한다고 말합니다.

마지막 질문에 답하기 위해 모든 클래스는 추상 또는 콘크리트 인 '일반 파생 클래스'와 같은 것이 없습니다.추상 메소드가있는 클래스는 추상 클래스이며 구체적이지 않은 클래스입니다. 이것은 두 가지 유형의 클래스를 구별하는 단지 방법입니다. 기본 클래스는 추상 또는 콘크리트가 될 수 있으며 파생 클래스는 추상 또는 콘크리트가 될 수 있습니다.

class abstract_base { 
public: 
    virtual void abstract_method1() = 0; 
    virtual void abstract_method2() = 0; 
}; 

class concrete_base { 
public: 
    void concrete_method1() { 
    /* do something */ 
    } 
}; 

class abstract_derived1 : public abstract_base { 
public: 
    virtual void abstract_method3() = 0; 
}; 

class abstract_derived2 : public concrete_base { 
public: 
    virtual void abstract_method3() = 0; 
}; 

class abstract_derived3 : public abstract_base { 
public: 
    virtual abstract_method1() { 
    /* do something */ 
    } 
    /* note that we do not provide an implementation for 
    abstract_method2 so the class is still abstract */ 
}; 

class concrete_derived1 : public concrete_base { 
public: 
    void concrete_method2() { 
    /* do something */ 
    } 
}; 

class concrete_derived2 : public abstract_base { 
public: 
    virtual void abstract_method1() { 
    /* do something */ 
    } 
    virtual void abstract_method2() { 
    /* do something */ 
    } 
    /* This class is now concrete because no abstract methods remain */ 
}; 
+7

간단한 설명과 함께 훌륭한 설명 ..! –

+0

함수 정의가 누락 된 경우 링크 오류 일뿐입니다. 추상 클래스는 다른 응답과 마찬가지로 = 0을 포함합니다. 더욱이 C++에서는 순수 가상 함수 *를 정의 할 수 있습니다. 실제로 정의되고 순수한 가상 소멸자가 일반적입니다. –

+0

간단하면서도 구석과 구석을 감싸고 있습니다. –

3

추상 클래스는 인스턴스화 할 수 없지만 구체적인 인스턴스는 인스턴스화 할 수 없습니다. 추상 클래스는 파생 클래스, 즉 인스턴스화 할 수있는 "청사진"역할을합니다.

예. Car 클래스 (추상) 인 반면 Audi S4 클래스 (Car에서 파생 됨) 클래스는 구체적인 구현입니다.

+0

나는 추상 클래스로 명확하지만, 일반 파생 클래스와 구체적인 클래스의 차이점은 무엇입니까? –

18

구체적인 클래스는 개체를 만드는 데 사용할 수있는 클래스입니다. 추상 클래스는 객체를 만드는 데 사용할 수 없습니다 (추상 클래스를 확장하고 객체를 만들 수있는 구체적인 클래스를 만들어야합니다).

원료를 "스탬프"하여 자동차를 만들 수있는 기계가 있다고 가정하십시오. 스탬퍼는 구체적인 클래스입니다. 이것으로부터 우리는 차 객체를 생성 할 수 있습니다. 추상 클래스는 stamper의 청사진입니다. 당신은 stamper의 청사진에서 자동차를 만들 수 없으며, 청사진에서 stamper class를 먼저 만들어야합니다.

+0

왜 콘크리트 클래스라고 부릅니까? –

+7

정의의 이유 : 콘크리트는 "실재 또는 실제 경험에서 현존하고, 감각에서인지 할 수 있으며, 실제", 추상은 "적용되지 않거나 실용적이며 이론적 인"것을 의미합니다. –

0

추상 클래스를 사용하는 좋은 예는 매우 모듈 식으로 제작할 때입니다. 데이터 저장소로 작업하고 있지만 데이터가 MySQL 데이터베이스, SQLite 데이터베이스, XML 파일 또는 일반 텍스트 일 ​​수 있다고 가정 해 보겠습니다. 코드에서이 다목적 성을 유지하려면 데이터 저장소에서 정보를 가져 오는 데 사용할 공용 메서드를 정의하는 클래스 AbstractDatastore을 만들면됩니다. 그런 다음 XmlDatastore, SQLiteDatastore 등과 같이 AbstractDatastore의 특정 구현을 만듭니다. 그런 다음 프로그램은 AbstractDatastore을 얻고 있고 해당 함수가 AbstractDatastore에 정의되어 있어야하지만 알지 못하거나 신경 쓰지 않습니다. 저장되거나 검색됩니다.

+0

이것은 추상과 구체적인 클래스의 차이점을 설명하지 않습니다. 당신이 그것을 사용할 때. – wich

+1

다른 사람들이 합리적인 설명을 해 주었고 실제 사례를 들었습니다. –

0

C++ Faq Lite는 이에 대한 답을 볼 수있는 좋은 사이트입니다 질문의 종류.

디자인 수준에서 추상 기본 클래스 (ABC)는 추상적 개념에 해당합니다. 자동차 정비사에게 정비사에게 차량을 수리했는지 묻는다면, 당신이 염두에 두었던 차량의 종류가 궁금 할 것입니다. 우주 왕복선, 해상 라이너, 자전거 또는 핵 잠수함을 수리하지 않을 가능성이 있습니다. 문제는 '차량'이라는 용어는 추상적 인 개념입니다 (예 : 어떤 차량을 만들지 않는 한 '차량'을 만들 수 없음). C++에서 클래스 Vehicle은 ABC, Bicycle, SpaceShuttle 등과 같이 파생 클래스 (OceanLiner는 a-kind-of-a vehicle)입니다. 실제 OO에서는 ABC가 모든 곳에서 나타납니다.

추상 클래스는 하나 이상의 순수 가상 멤버 함수가있는 클래스입니다. 추상 클래스의 객체 (인스턴스)를 만들 수 없습니다.

class Shape { 
public: 
    virtual void draw() const = 0; // = 0 means it is "pure virtual" 
    ... 
}; 
+0

이것은 추상 클래스와 구체적인 클래스의 차이점을 설명하지는 않으며 추상 클래스는 무엇인지 설명합니다. – wich

+0

나는 구체적인 클래스가 무엇인지 암묵적으로 나타내는 추상 클래스의 설명을 읽었다. 또한 C++ FAQ Lite는 매우 유용한 사이트입니다. 그러므로, 나는 흥분했다. –

+0

@wich 추상 클래스가 "하나 이상의 순수 가상 멤버 함수를 가진 클래스"인 경우 명확하지 않은 클래스입니다. 아니면 반 추상 클래스가 있습니까? –

1

기본 클래스와 파생 클래스는 abstract 클래스와 concrete 클래스의 직각 개념입니다.

기본 클래스는 다른 클래스에서 상속받지 않는 클래스입니다. 파생 클래스는 다른 클래스에서 상속받습니다.

추상 클래스는 하나 이상의 순수 가상 함수가있는 클래스입니다. 구체적인 클래스에는 순수 가상이 없습니다.

추상 클래스는 기본 클래스 또는 파생 클래스 (다른 추상 클래스에서 파생 됨) 일 수 있습니다. 구체적인 클래스는 기본 또는 파생 클래스 일 수도 있습니다. 파생 클래스에 순수 가상 함수를 추가하여 구체적인 클래스에서 추상 클래스를 파생시킬 수도 있습니다. 그러나 일반적으로 사용되는 경우 하나의 기본 추상 클래스와 하나 이상의 구체적인 파생 클래스가 있습니다.

0

구체적인 클래스에는 모든 메소드가 구현되어 있습니다. 추상 클래스는, 그 메소드를 확장 해 구현되어 있지 않은 메소드를 구현할 수 있도록, 적어도 1 개 (살) 이상의 메소드를 구현하고 있습니다.

장점 : 추상 클래스에서 확장하면 기본 클래스 &의 모든 기능을 사용하여 구현되지 않은 메서드를 구현할 수 있습니다. 따라서 클래스 디자이너는 기본적으로 클래스가 사용하기 전에 추상 메서드로 코드를 작성해야합니다.

20

추상 클래스은 개체를 만드는 데 사용할 수 없습니다. 반면, 콘크리트 클래스은 개체를 만드는 데 사용할 수 있습니다.

콘크리트은 실제로 ' 또는 실제 경험 있음; 감각으로인지 할 수있는; 레알''. 반면, 추상은 '은 적용되지 않거나 pratical하지 않습니다. 이론 '입니다.

추상화 클래스를 인스턴스화 할 수 없습니다. 반면, 콘크리트 수 있습니다.

추상 클래스는 하나 이상의 순수 가상 기능을 가진 클래스입니다. 구체 클래스에는 순수 가상 기능이 없습니다.

관련 문제