2015-11-17 5 views
0

Я пытаюсь реализовать базовый класс, который содержит чистую виртуальную функцию, которую базовый класс предоставит для реализации по умолчанию. В настоящее время моя реализация сводится к следующему:Класс с реализацией чистой виртуальной функции

class Base {  
    public: 
    Base(string bVar); 
    virtual string getVar() const =0; 

    private: 
    string myBVar; 
}; 

Base::Base(string bVar){ 
    this->myBVar = bVar; 
} 

string Base::getVar() const { //virtual function default implementation 
    return this->myBVar; 
} 

class Derived : public Base { 

    public: 
    Derived(string dVar); 
    string getVar() const; // implements pure virtual const base function 

    private: 
    string myDVar; 
}; 

Derived::Derived(string dVar) : Base(""){ 
    this->myDVar = dVar; 
} 

string Derived::getVar() const { //virtual 
    return this->myDVar; 
} 

int main(){ 

    Base aBaseObj("param"); 
    return 0; 
} 

Когда я скомпилировать этот код, я получаю эту ошибку:

error: cannot declare variable 'aBaseObj' to be of abstract type 'Base' with note: because the following virtual function are pure within 'Base' ...virtual std::string Base::getVar() const

Этот вопрос был задан before и ответил на. И я не могу понять, как мой код значительно отличается от принятого ответа. Когда я удаляю чистый виртуальный спецификатор, код компилируется и работает как ожидалось.

Где я ошибаюсь здесь в отношении маркировки функции моего базового класса как чистой виртуальной и предоставления реализации для нее, для которой производные классы должны обеспечивать их собственную реализацию?

+1

Вы не можете создать экземпляр абстрактного класса. Ваш базовый класс содержит чистую виртуальную функцию, и экземпляр, таким образом, не может быть создан. –

+0

@ Rishit взгляните на связанный вопрос. Как моя реализация отличается? – amoeba

+0

Ваша реализация тела чистой виртуальной функции верна. Но вы не можете создать экземпляр вашего базового класса, поскольку он содержит чистые виртуальные функции. –

ответ

2

Чистые виртуальные функции - это виртуальные функции, реализация которых должна предоставляться производным классом. Это одна из причин сделать вашу виртуальную функцию чистой, так что производный класс должен иметь свою реализацию.

virtual void function()=0 является чистой виртуальной функцией, где =0 указывает, что это чистота.

Если у вас есть чистая виртуальная функция в классе, вы не должны создавать экземпляр класса. (В противном случае выполнение функции pure virtual не имеет большого смысла). Такой класс является абстрактным классом.

Теперь могут быть случаи, когда вы хотите иметь собственную реализацию чистой виртуальной функции, чтобы производный класс мог ее напрямую использовать. Следовательно, в некоторых случаях мы предоставляем тело чистой виртуальной функции.

Если вы хотите создать экземпляр этого класса, не делайте свою виртуальную функцию чистой.

2

Сообщение об ошибке Ther сообщает, что вы не можете выделить объект класса с чистыми виртуальными функциями.

Это означает, что ваша проблема - основная функция int, пытающаяся инициализировать объект базового класса.