使用抽象基类C ++中的变量派生的类

时间:2018-07-26 11:09:03

标签: c++ derived-class

我创建了一个抽象的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对象中使用它们的正确方法是什么?

2 个答案:

答案 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,以免破坏封装。