Joe Schryver
Joe Schryver

Reputation: 11

Object of abstract class type "Rectangle" is not allowed

//QuizShape.h
#ifndef QUIZSHAPE_H
#define QUIZHAPE_H
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

class QuizShape
{
protected:
    //outer and inner symbols, and label
    char border, inner;
    string quizLabel;
public:
    //base class constructor with defaults
    QuizShape(char out = '*', char in = '+', string name = "3x3 Square")
    {
        border = out;
        inner = in;
        quizLabel = name;
        cout << "base class constructor, values set" << endl << endl;
    };

    //getters
    char getBorder() const
    { return border; }
    char getInner() const
    { return inner; }
    string getQuizLabel() const
    { return quizLabel; }

    //virtual functions to be defined later
    virtual void draw( ) = 0;
    virtual int getArea( ) = 0;
    virtual int getPerimeter( ) = 0;

};


class Rectangle : public QuizShape
{
protected:
    //height and with of a rectangle to be drawn
    int height, width;
public:
    //derived class constructor
    Rectangle(char out, char in, string name,
                int h = 3, int w = 3):QuizShape(out, in, name)
    {
        height = h;
        width = w;
        cout << "derived class constructor, values set" << endl << endl;
    }

    //getters
    int getHeight() const
    { return height; }
    int getWidth() const
    { return width; }

    //*********************************************
    virtual void draw(const Rectangle &rect1)
    {
        cout << "draw func" << endl;
        cout << rect1.height << endl;
        cout << rect1.getWidth() << endl;
        cout << rect1.getQuizLabel() << endl;
    }

    virtual int getArea(const Rectangle &rect2)
    {
        cout << "area func" << endl;
        cout << rect2.getInner() << endl;
        cout << rect2.getBorder() << endl;
    }

    virtual int getPerimeter(const Rectangle &rect3)
    {
        cout << "perim func" << endl;
        cout << rect3.height << endl;
        cout << rect3.getWidth() << endl;
        cout << rect3.getQuizLabel() << endl;   
    }
    //************************************************
};



#endif

These are the class types so far.

//QuizShape.cpp
#include "QuizShape.h"

This currently does nothing but bridge the files.

//pass7.cpp
#include "QuizShape.cpp"

int main()
{
    Rectangle r1('+', '-', "lol", 4, 5);

    cout << r1.getHeight() << endl;
    cout << r1.getWidth() << endl;
    cout << r1.getInner() << endl;
    cout << r1.getBorder() << endl;
    cout << r1.getQuizLabel() << endl;

    system("pause");
    return 0;
}

The code will not compile due to the fact that Rectangle is supposedly an abstract class, and when hovering over the declaration of r1 in main, I receive the error

"Object of abstract class type "Rectangle" is not allowed".

I have checked other answers on this site and others and have not come across something that solves the problem.

NOTE: I understand that the statements for virtual functions ending in =0; cause the class to become an abstract one. QuizShape SHOULD be abstract. I have defined the virtual functions in Rectangle and yet it remains an abstract class.

How can I modify the virtual functions Rectangle class so that Rectangle is no longer abstract?

Upvotes: 1

Views: 471

Answers (2)

Shafik Yaghmour
Shafik Yaghmour

Reputation: 158499

Your methods int the abstract class QuizShape are:

virtual void draw( ) = 0;
virtual int getArea( ) = 0;
virtual int getPerimeter( ) = 0;

but in Rectangle they take const Rectangle &rect1 as parameter so you shadowing the methods and not overriding the abstract one at all. You need to have methods in Rectangle with the same signature as the ones in the abstract base class.

Upvotes: 2

Gary
Gary

Reputation: 5732

The overridden methods must have the exact same signature, in the derived class you have given them arguments.

Upvotes: 0

Related Questions