我创建了一个抽象的Light
类,它具有所有灯都通用的字段和方法,现在我尝试从中派生一个Directional Light
。
class Light
{
public:
unsigned int strength;
Color color;
unsigned int index;
Light() {};
virtual ~Light() = 0;
virtual pointLuminosity() = 0;
};
class DirectionalLight : public Light
{
public:
Vector direction;
DirectionalLight(const unsigned int &_strength, [...] ): strength(_strength), [...] {}
};
上面的代码导致错误:
error: class 'DirectionalLight' does not have any field named 'strength'
从Light
类派生所有字段并在DirectionalLight
对象中使用它们的正确方法是什么?
答案 0 :(得分:4)
您可以在初始化列表之外的任何地方使用强度。可行
DirectionalLight(const unsigned int &_strength) { strength = _strength; }
或者,您可以将构造函数添加到Light
class Light
{
public:
unsigned int strength;
Light(unsigned s) : strength(s) {}
};
DirectionalLight(const unsigned int &_strength) : Light(_strength) {}
答案 1 :(得分:2)
由于strength
不是DirectionalLight
的成员,因此无法在初始化列表中进行此操作。您必须在构造函数的主体中初始化派生成员,或在派生类构造函数的初始化列表中调用基类构造函数。
例如:
DirectionalLight(const unsigned int &_strength): { strength = _strength; }
或者:
Light(int _strength) : strength(_strength) {}
...
DirectionalLight(const unsigned int &_strength): Light(_strength) { }
首选第二个选项,还应保护strength
中的Light
,以免破坏封装。