虚拟的亲子关系
Virtual parent and child relationship
下面的代码片段来自我的Keyboard.h
和Keyboard.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
相关文章:
- 虚拟决赛作为安全
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- C++GTKMM gui循环依赖关系
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 大小虚拟继承中的派生类
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- std::is_trivially_copyable_v 关于虚拟功能
- 删除C++继承中虚拟类成员的代码重复
- 虚拟的亲子关系
- 虚拟内存和核心转储之间的关系