以下编译代码显示结果区域为零。一些宽度和高度变量仍然保持为零,即使我们使用基础构造函数设置它。
#include <iostream>
using namespace std;
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height / 2);
}
};
// Main function for the program
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// store the address of Rectangle
shape = &rec;
// call rectangle area.
cout << shape->area() << endl;
// store the address of Triangle
shape = &tri;
// call triangle area.
cout << shape->area() << endl;
return 0;
}
输出: 矩形类区域: 0 矩形类区域: 0
试图找出区域为零的原因以及如何让pgm打印实际区域?
答案 0 :(得分:1)
正确的语法是:
Rectangle( int a=0, int b=0) : Shape(a, b)
{ // ^^^^^^^^^^^^
}
您需要将Shape
构造函数作为初始化列表的一部分进行调用
如您的示例所示,如果您将其写为语句,
{
Shape(a,b); // <--- no effect on Base part
}
然后,创建并销毁临时Shape
对象,因此它没有任何效果。
答案 1 :(得分:0)
你的子类的构造函数应该如下,
Rectangle( int a=0, int b=0)
:Shape(a, b) //call base class constructor
{
//Shape(a, b); // you are creating new object of shape here , not calling base constructor
}