0

下面的代码片段来自我的Keyboard.hKeyboard.cpp. 我的问题是,我将如何实现分层的父子关系?因此,如果孩子没有实现任何虚拟成员,则父母可以自由地这样做。例如,子级实现了 KeyboardDepressA,但没有实现 KeyboardDepressB,让父级实现 KeyboardDepressB 的 catch。父母和孩子当然也有不同的类型,什么不是......

我不想让孩子知道父母的支持Device::Keyboard;因此,我想使用 get 实例调用父级,如KeyboardDepressB. 为了完成这项工作,我需要将父级分配给static实例本身,但static不支持关键字this。所以我该怎么做?

我将代码保持在最低限度。如果需要更多,请随时询问。^^

class Keyboard
{

private:

    Keyboard ();
    ~Keyboard ();

public:

    static Device::Keyboard& Instance();
    static void SetParent(Device::Keyboard *cpParent);

    virtual void    KeyboardDepressA    ();
    virtual void    KeyboardReleaseA    ();

    virtual void    KeyboardDepressB    ();
    virtual void    KeyboardReleaseB    ();

    …   …   ...
};


Device::Keyboard&
Keyboard::Instance()
{

    static Device::Keyboard nrKeyboard;
    return nrKeyboard;

} // member

void
Keyboard::SetParent(Device::Keyboard *cpParent)
{

    Device::Keyboard& nrParent(Keyboard::Instance());
    *this = cpParent;

} // member

void
Keyboard::KeyboardDepressA()
{

    Device::Keyboard& nrParent(Keyboard::Instance());
    nrParent.KeyboardDepressA();

} // member

void
Keyboard::KeyboardReleaseA()
{

    Device::Keyboard& nrParent(Keyboard::Instance());
    nrParent.KeyboardReleaseA();

} // member

void
Keyboard::KeyboardDepressB()
{

    Device::Keyboard& nrParent(Keyboard::Instance());
    nrParent.KeyboardDepressB();

} // member

void
Keyboard::KeyboardReleaseB()
{

    Device::Keyboard& nrParent(Keyboard::Instance());
    nrParent.KeyboardReleaseB();

} // member
4

1 回答 1

1

所以,一般来说,将继承与单例模式混合起来很复杂,所以要小心。

如果您有父子关系,则在 C++ 中,父和/或子可以实现虚函数。

如果您希望父级而不是子级实现它:在父级中将其声明为虚拟并为父级实现,但不要为子级声明或实现它

class parent
{
public:
    virtual void func();
}
void parent::func(){ ... }
class child : public parent
{
};
parent* p = new child;
p->func(); // calls parent's func

如果您想要一个被孩子覆盖的父实现:在父类和子类中将其声明为虚拟并为两个类实现它(注意孩子可以调用父类的实现而无需了解实现是什么)

class parent
{
public:
    virtual void func();
}
void parent::func(){ ... }
class child : public parent
{
    virtual void func();
};
void child::func(){ ... parent::func();}
parent* p = new child;
p->func(); // calls child's func

如果您希望子级实现它而父级不实现它:将其声明为父级中的纯虚拟成员并为子级声明并实现它

class parent
{
public:
    virtual void func() = 0;
}
class child : public parent
{
    virtual void func();
};
void child::func(){ ... }
parent* p = new child;
p->func(); // calls child's func
于 2013-05-21T20:43:28.533 回答