虚拟的亲子关系

Virtual parent and child relationship

本文关键字:关系 虚拟      更新时间:2023-10-16

下面的代码片段来自我的Keyboard.hKeyboard.cpp。我的问题是,我如何实现一个分层的父子关系?因此,如果子类没有实现任何虚成员,父类可以自由地这样做。例如,子进程实现了keyboarddepression sa,但没有实现keyboarddepression sb,让父进程实现keyboarddepression sb的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

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

如果你有一个父子关系,在c++中父和/或子可以实现虚函数。

如果你希望父类实现它而不是子类:在父类中声明它为virtual,并为父类实现它,但不为子类声明或实现它

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

如果你想让父类实现被子类覆盖:在父类和子类中声明它为virtual,并在两个类中都实现它(注意子类可以调用父类的实现,而不必了解实现是什么)

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