2014-12-10 2 views
0

내 문제는 : 어떻게 상속 된 클래스에서 순수 가상 함수를 구현합니까? 그것은 항상 내가 유일한 기능을 구현하지 않았다고 말하지만 그것을하려고했습니다. 그럼 내 실수는 어디 있니?C++ 상속 순수 가상 함수

내 코드 :

A.h :

class A { 
public: 
    A(); 
    virtual std::pair<A*, A*> f1(const A& o) const=0; 
    virtual ~A(); 
}; 

B.h :

#include "A.h" 

class B : public A { 
public: 
B(); 
virtual ~B(); 
virtual std::pair<A*, A*> f1(const A& o); 
}; 

B.cpp :

#include "B.h" 

B::B() : A() {} 
B::~B() {} 
std::pair<A*, A*> B::f1(const A& o) { 
    A* K1=new B(); 
    A* K2=new B(); 
    return std::make_pair (K1, K2); 
} 

나는 다음과 같은 얻을 오류 :

B.cpp: In member function ‘virtual std::pair<A*, A*> B::f1(const A&)’: 
B.cpp:14:16: error: cannot allocate an object of abstract type ‘B’ 
    A* K1=new B(); 
       ^
In file included from B.cpp:1:0: 
B.h:4:7: note: because the following virtual functions are pure within ‘B’: 
class B : public A { 
    ^
In file included from B.h:1:0, 
       from B.cpp:1: 
A.h:10:28: note: virtual std::pair<A*, A*> A::f1(const A&) const 
    virtual std::pair<A*, A*> f1(const A& o) const=0; 
          ^
B.cpp:15:16: error: cannot allocate an object of abstract type ‘B’ 
    A* K2=new B(); 
       ^
In file included from B.cpp:1:0: 
B.h:4:7: note: since type ‘B’ has pure virtual functions 
class B : public A { 
    ^

기타 : A * K1 = new A(); 또는 새로운 B(); ?

+3

'A :: f1'는'const' 메소드입니다. 'B' 클래스의 메소드 끝 부분에서'const'를 잊어 버렸습니다. – crayzeewulf

+1

그래서'override' 키워드가 굉장합니다. – Jarod42

답변

2

이 있습니다 '를 옆에 두 측면을 놓고 자세히 살펴 :

는 차이가 이들 중 하나가
A: virtual std::pair<A*, A*> f1(const A& o) const=0; 
B: virtual std::pair<A*, A*> f1(const A& o); 

글쎄, 난을 참조하십시오 const 기능과 다른 기능은 없습니다. 그것들은 두 가지 다른 기능을합니다. const 함수가 오버로드 된 적이 없기 때문에 B은 여전히 ​​추상 형식이며 A과 같이 인스턴스이며 인스턴스화 할 수 없습니다.

현재 원시 포인터를 소유하고있는 곳의 std::unique_ptr을 사용하는 것이 좋습니다. 나중에 두통을 예방할 것입니다. B에서

2

오버라이드는 cv-qualification에서 일치해야합니다. 당신은 const 여기에 놓치고있어 : 그것을 무시하지 않고 귀하의 기본 클래스 방법은 가상 순수하기 때문에

std::pair<A*, A*> B::f1(const A& o) /* [const] */ 

, 당신의 파생 클래스가 추상적된다. 추상적 인 유형의 객체를 인스턴스화 할 수 없습니다.

선언문과 정의 모두에 const을 추가해야합니다. 또한,이 우선 확인이 키워드 override 사용할 수 있도록 :

std::pair<A*, A*> f1(const A& o) override; // error since it does not override 
2

, 당신의 기능은 virtual std::pair<A*, A*> f1(const A&) const; 할 필요가 또는 당신이 std::pair<A*, A*> f1(const A&) const override;를 수행 C++ 11 컴파일러를 사용하는 경우 (A.

에서 하나를 무시하지, 다른 기능 그리고 그것은에 분명해진다 함수를 오버라이드 (override)하려고 한 독자)