Ошибка «неопределенная ссылка» при использовании наследования и чисто виртуальных функций - PullRequest
0 голосов
/ 21 апреля 2020

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

#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;


class shape{
protected:
string type;
float width;
float height;
public:
shape(){
    type = "shape";
    width = 0;
    height = 0;
}

string getType(){
    return type;
}

float getWidth(){
    return width;
}

float getHeight(){
    return height;
}

void setType(string t){
    type = t;
}

void setWidth(float w){
    width = w;
}

void setHeight(float h){
    height = h;
}

virtual float area() = 0;
virtual void display(){
    cout<<"Type : "<<type;
    cout<<"Width :"<<width;
    cout<<"Height :"<<height;
}
};


class rectangle:public shape{
public:
rectangle();
void display();
float area(){
    int A;
    A = width*height;
return A;
}
};



int main(){

rectangle rec;
rec.setHeight(4);
rec.setWidth(5);
rec.display();

}

Ошибка, которую она дает:

04:36:04 **** Incremental Build of configuration Debug for project Q1 ****  

make all 'Файл сборки: ../src/Q1.cpp' 'Вызов: кросс-компилятор G ++' g ++ -O0 -g3 -Wall - c -fmessage-length = 0 -MMD -MP -MF "src / Q1 .d "-MT" src / Q1.o "-o" src / Q1.o "
" ../src/Q1.cpp "'Завершено строительство: ../src/Q1.cpp '' '' Построение цели: Q1 '' Вызов: перекрестный компоновщик G ++ 'g ++ -o "Q1" ./src/Q1.o
./src/Q1.o: В функции main': F:\Semester 2\OOP\Theory\Assignment5- Composition and Inheritance\19I-2167<br> D\Q1\Debug/../src/Q1.cpp:120: undefined reference to rectangle :: rectangle ( ) '
F: \ Semester 2 \ OOP \ Theory \ Assignment5- Состав и наследование \ 19I-2167
D \ Q1 \ Debug /../ src / Q1. cpp: 123:
undefined ссылка на rectangle::display()' ./src/Q1.o:Q1.cpp:(.rdata$.refptr._ZTV9rectangle[.refptr._ZTV9rectangle]+0x0): undefined reference to vtable для прямоугольника collect2.exe: ошибка: ld вернул 1 состояние завершения make: *** [makefile: 47: Q1] Ошибка 1 «make all» завершена с кодом выхода 2. Сборка может быть неполной.

04:36:06 Build Failed. 3 errors, 0 warnings. (took 2s.243ms)

1 Ответ

3 голосов
/ 21 апреля 2020

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

class rectangle {
public:
    rectangle();
    void display();
    float area(){
        int A = 42;
        return A;
    }
};


int main(){

    rectangle rec;
    rec.display();

}

. Вы объявляете конструктор, и вы объявляете метод display, и компилятор принимает это как обещание, что вы где-нибудь предоставите их определение. Компоновщик не может их найти, отсюда и ошибка. Вы должны определить эти методы.

Однако в вашем коде фактически оба метода не нужны. Вы можете использовать конструктор, сгенерированный компилятором, и вы можете повторно использовать shape::display, следовательно, вы можете изменить rectangle на:

class rectangle : public shape{
public:
    float area(){
        int A;
        A = width*height;
        return A;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...