使用来自抽象基础 class C++ 的变量派生 class
Derived class using variables from abstract base class C++
我创建了一个抽象 Light
class,其中包含所有灯通用的字段和方法,现在我尝试从中导出 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
class 派生所有字段并在 DirectionalLight
对象中使用它们的正确方法是什么?
除初始化列表外,您可以在任何地方使用强度。这有效
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) {}
你不能在初始化列表中这样做,因为 strength
不是 DirectionalLight
的成员。您必须在构造函数主体中初始化派生成员或在派生 class 构造函数的初始化列表中调用基 class 构造函数。
例如:
DirectionalLight(const unsigned int &_strength): { strength = _strength; }
或:
Light(int _strength) : strength(_strength) {}
...
DirectionalLight(const unsigned int &_strength): Light(_strength) { }
首选第二个选项,Light
中的strength
也应该被保护,所以封装不会被破坏。
我创建了一个抽象 Light
class,其中包含所有灯通用的字段和方法,现在我尝试从中导出 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
class 派生所有字段并在 DirectionalLight
对象中使用它们的正确方法是什么?
除初始化列表外,您可以在任何地方使用强度。这有效
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) {}
你不能在初始化列表中这样做,因为 strength
不是 DirectionalLight
的成员。您必须在构造函数主体中初始化派生成员或在派生 class 构造函数的初始化列表中调用基 class 构造函数。
例如:
DirectionalLight(const unsigned int &_strength): { strength = _strength; }
或:
Light(int _strength) : strength(_strength) {}
...
DirectionalLight(const unsigned int &_strength): Light(_strength) { }
首选第二个选项,Light
中的strength
也应该被保护,所以封装不会被破坏。