2014-12-10 4 views
0

моя проблема: Как реализовать чистые виртуальные функции в унаследованном классе? Он всегда говорит, что я не реализовал единственную функцию, но я пытался это сделать. Так где же моя ошибка?C++ Inheritance чистые виртуальные функции

Мой код:

хиджры:

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 = новый A(); или новый B(); ?

+3

'A :: f1' - это метод' const'. Вы забыли 'const' в конце метода в классе' B'. – crayzeewulf

+1

Вот почему ключевое слово 'override' является удивительным. – Jarod42

ответ

2

Lets' поместить эти два бок о бок и выглядеть ближе:

A: virtual std::pair<A*, A*> f1(const A& o) const=0; 
B: virtual std::pair<A*, A*> f1(const A& o); 

Ну, я вижу, разница, один из них a const функция, а другая нет. Это делает их двумя различными функциями. Поскольку функция const никогда не была перегружена, B по-прежнему является абстрактным, например A и не может быть создан.

A* K1 = new A(); //would give you an A, if A weren't abstract. Do you want an A or B? 
A* K1 = new B(); //gives a B object, stored as a pointer to an A interface. 

Я также настоятельно рекомендую использовать std::unique_ptr, где Вы в настоящее время владеющим сырые указатели. Позднее они предотвратят головные боли.

2

Ваше переопределение должно совпадать с квалификацией cv. Вы пропускаете 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; или это другая функция, не перекрывая друг от А.

(Если вы используете компилятор C++ 11, делать std::pair<A*, A*> f1(const A&) const override; и становится ясно, что вы намеревались переопределить функцию.)

Смежные вопросы