使用来自抽象基础 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也应该被保护,所以封装不会被破坏。