我的最后一个问题是一团糟。我得错了输出。
所以我的主要内容是:
image = QImage(width, height, 32); // 32 Bit
Color amb(0.1,0.1,0.1);
Color difCoef(0.75,0.6,0.22);
Color spec(0.5,0.5,0.5);
double shineExp = 3.0;
Sphere *s = new Sphere(Point(0.0,0.0,-5), 100.0, amb, difCoef, spec, shineExp);
shapes.push_back(s);
其中形状是矢量<形状*>形状;
Shape *x = shapes[0];
cout << "Shine" << x->shine << endl;
即使答案应为3.0,也要打印零。
以下是我的课程:
#include "shape.h"
class Sphere : public Shape
{
public:
Point centerPt;
double radius;
Color ambient;
Color dif;
Color spec;
double shine;
Sphere(Point center, double rad, Color amb, Color difCoef, Color specu, double shineVal)
{
centerPt = center;
radius = rad;
ambient = amb;
dif = difCoef;
spec = specu;
shine = shineVal;
}
class Shape
{
public:
Shape() {}
~Shape(){}
Color ambient;
Color dif;
Color spec;
double shine;
virtual bool checkIntersect(Point p, Point d, Point &temp) = 0; // If intersects, return true else false.
virtual Point getNormal(Point intPt) = 0; // Get the normal at the point of intersection
//virtual void printstuff() = 0;
};
答案 0 :(得分:6)
问题在于您在派生类中重复变量声明。您无需在派生类double shine
中重新声明Shape
中已存在于Sphere
中的变量。由于Sphere
继承自Shape
,Shape
中的所有公共成员变量都会自动在Sphere
中继承,并且不需要重新声明。重新声明它们将导致两个不同的成员变量,即Sphere::shine
是与Shape::shine
完全不同的变量。
因此,当您为Sphere::shine
分配值,然后稍后使用基类Sphere
指针访问Shape
的实例时,shine
的值为不会是你期望的。
答案 1 :(得分:1)
Sphere
的每个实例都有两个名为shine
的变量。一个在派生类中,一个在基类中。
Sphere
构造函数初始化派生的Sphere::shine
,但x->shine
访问基类变量,因为x
的类型为“Shape
的指针”。成员变量没有任何“虚拟”行为。
我几乎可以肯定你想要的是将公共变量保存在基类Shape
中,而不是重新声明相同的命名并在派生类中键入成员变量。您应该只声明派生类中派生类的唯一属性(例如centerPt
的{{1}}和radius
)。
答案 2 :(得分:1)
您不应在shine
Sphere
成员