Why is inherited member not allowed?

C++Inheritance

C++ Problem Overview


I'm beginner to C++ and I'm doing one of the exercises about abstract class and inheritance.

This is my abstract class:

#ifndef   SHAPE_H 
#define  SHAPE_H
class Shape
{
	public:
	    virtual void area();
		virtual void perimeter();
		virtual void volume();
};
#endif

This is my concrete class that implements the abstract class:

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

class Circle : public Shape
{
	public:
		Circle(int);
	private:
		int r;
};

Circle::Circle(int rad)
{
	r = rad;
}

void Circle::area()
{
	cout << "Area of this cirle = " << 3.14 * pow(r, 2) << endl;
}

void Circle::perimeter()
{
	cout << "Perimeter of this cirle = " << 2 * 3.14 * r << endl;
}

void Circle::volume()
{
	cout << "Volume is not defined for circle." << endl;
}

I got red lines under area(), perimeter(), and volume() in my Circle class, which showed "Error: inherited member is not allowed". I went through my class ppt and googled for answer but no luck. Any help is appreciated.

C++ Solutions


Solution 1 - C++

You have to declare the over-ridden functions as part of your class definition

class Circle : public Shape
    {
    public:
        Circle(int);
        virtual void area(); // overrides Shape::area
        void perimeter();    // overrides Shape::perimeter
        virtual void volume();
    private:
        int r;
    };

Note that the use of virtual here is optional.

As n.m. noted, you should also include a virtual destructor in Shape. You may also want to make its virtual functions pure virtual (based on your comment about Shape being abstract)

class Shape
{
public:
    virtual ~Shape() {}
    virtual void area() = 0;
    virtual void perimeter() = 0;
    virtual void volume() = 0;
};

Solution 2 - C++

you have to declare the override methods too in the Circle class

class Circle : public Shape
    {
    public:
        Circle(int);
        virtual void area();
        virtual void perimeter();
        virtual void volume();
    private:
        int r;
    };

Solution 3 - C++

First you should make you Shape class explicitly abstract:

class Shape
{
public:
    virtual void area() = 0;
    virtual void perimeter() = 0;
    virtual void volume() = 0;
};

This way you do not have to define that methods in class Shape, and what is more important if you forget to override any of abstract method in derived class and would try to create an instance of it, compiler will remind you. Second when you override virtual method in derived class you need to declare them:

class Circle : public Shape
{
public:
    Circle(int);

    virtual void area();
    virtual void perimeter();
    virtual void volume();
private:
    int r;
};

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1447343View Question on Stackoverflow
Solution 1 - C++simoncView Answer on Stackoverflow
Solution 2 - C++V-XView Answer on Stackoverflow
Solution 3 - C++SlavaView Answer on Stackoverflow