gpt4 book ai didi

c++ - 虚拟父子关系

转载 作者:行者123 更新时间:2023-11-28 07:36:37 24 4
gpt4 key购买 nike

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

我不想让 child 知道 parent 对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++ 中,父子可以实现虚函数。

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

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

关于c++ - 虚拟父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16678156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com