I am trying to practice OOP in C but I am running into an issue regarding overriding of functions. In my Shape2D and Shape3D classes, I have virtual functions which I redefine in the Square and Sphere classes (ShowArea() and ShowVolume() respectively). However, when I redefine the function and try to run the main, it outputs the errors:
Shapes.cpp:88:14: error: 'void Square::ShowArea() const' marked 'override', but does not override
void ShowArea() const override{
Shapes.cpp:353:14: error: 'void Sphere::ShowVolume() const' marked 'override', but does not override
void ShowVolume() const override {
Below is a snippet of relevant code from both the Shape2D, Square, Shape3D, and Sphere classes.
class Shape2D : virtual public Shape {
public:
virtual float Area() const = 0;
void ShowArea() const;
virtual string GetName2D() const = 0;
}
class Square: public Shape2D {
private:
float squareLen;
public:
// Constructors
Square() {
squareLen = 0;
}
Square(float len) {
squareLen = len;
}
string GetName2D() const override {
string res;
return res;
}
// Returns the area of the shape
float Area() const override {
return (squareLen * squareLen);
}
void ShowArea() const override{
cout << "Square Area: " << endl;
}
}
class Shape3D : virtual public Shape {
public:
virtual float Volume() const = 0;
void ShowVolume() const;
virtual string GetName3D() const = 0;
}
class Sphere: public Shape3D {
private:
Circle* SphereBase;
public:
Sphere() {
SphereBase = new Circle();
}
Sphere(float radius) {
SphereBase = new Circle(radius);
}
float Volume() const {
return (1.3333 * pi * pow(SphereBase->GetRadius(), 3));
}
void ShowVolume() const override {
}
Why is this the case when I am redefining the function in the subclasses and the function is virtual in its original definition? It does not work for any of my shapes (I have 6 shapes but only included 2 in this post) so I dont think its a typo and its crashes across both 2D and 3D shapes so its not an issue with those specific classes.
CodePudding user response:
The function ShowArea
declared in the class Shape2D
void ShowArea() const;
is not a virtual function. So this declaration in the derived class Square
void ShowArea() const override{
cout << "Square Area: " << endl;
}
is incorrect.
Also the function ShowVolume
declared in the class Shape3D
is not a virtual function
void ShowVolume() const;
It may not be overridden in a derived class.
You need to declare the functions to be virtual in base classes that they could be overridden.
CodePudding user response:
The problem is that currently the member functions showArea
and showVolume
are not virtual member functions and we can use override
keyword only when overriding a virtual member function.
To solve this you need to make showArea
and showVolume
virtual member functions by adding the keyword virtual
as shown below:
class Shape2D : virtual public Shape {
public:
//--vvvvvvv------------------------->virtual added here
virtual void ShowArea() const;
//other code here
};
class Shape3D : virtual public Shape {
public:
//------vvvvvvv------------------------------>virtual added here
virtual void ShowVolume() const;
//other code here
};
//other code here