gpt4 book ai didi

C++从具有相同名称的成员的基类多重继承

转载 作者:太空狗 更新时间:2023-10-29 22:57:57 25 4
gpt4 key购买 nike

让我告诉你我遇到的问题。我正在设计一组类来控制数字设备。该设备可以在两种操作模式下工作。在第一种模式下,它可以执行一组特定的操作,而在第二种模式下,它可以执行另一组操作(两者之间可能有一些共同的操作)。我还可以在运行时更改设备的模式,这样我就可以在必要时在两种模式之间切换。独立于模式,设备使用同一组寄存器。

我正在考虑为每个模式使用一个基类来解决这个问题,这样当我需要第一组操作时我可以拥有模式 1 的对象,而当我需要第二组操作时我可以拥有模式 2 的对象。然后我可以从这两个基类派生一个类,这样我就可以拥有执行所有操作的对象。

我设计的问题是两个基类有一些共同的功能和对相同寄存器的引用。因为我不能阻止成员的继承,所以我会在派生类中有重复项。我知道我可以选择使用范围运算符访问哪个拷贝,但我仍然认为这是一个糟糕的设计。

所以我的问题是:是否有解决此问题的惯用方法?

如果没有正确或简单的方法来解决这个问题,我正在考虑设计 3 个分层独立的类。我会有一些重复的代码,但这不是什么大问题,对吧?

下面的代码(简化)用于说明:

class mode1
{
protected:
volatile uint8_t& reg1;
volatile uint8_t& reg2;
uint8_t data;
public:
virtual void operation1() final { // do something }
virtual void operation2() final { // do something }
virtual void operation3() final { // do something }
};


class mode2
{
protected:
volatile uint8_t& reg1;
volatile uint8_t& reg2;
uint8_t data;
public:
virtual void operation4() final { // do something }
virtual void operation2() final { // do something }
virtual void operation5() final { // do something }
};


class mode1and2 : public mode1, public mode2
{
public:
void operation6() { // do something }
void operation7() { // do something }
};

注意模式 1 和模式 2 具有 operation2 和所有共同的数据成员。

最佳答案

我会将 mode1mode2 的公共(public)部分放在一个公共(public)基类中,比方说 Common,然后包含您的数据和成员函数operation2。然后,与虚拟继承一起,您可以对同一数据有两个 View ,如果需要,甚至可以同时查看。

class common {
friend class mode1;
friend class mode2;
protected:
volatile uint8_t& reg1;
volatile uint8_t& reg2;
uint8_t data;

public:
virtual void operation2() final { // do something
};

};

class mode1 : public virtual common
{
public:
virtual void operation1() final { // do something
};
virtual void operation3() final { // do something }
};
};

class mode2 : public virtual common
{
public:
virtual void operation4() final { // do something
}
virtual void operation5() final { // do something
}
};


class mode1and2 : public mode1, public mode2
{
public:
void operation6() { // do something }
};
void operation7() { // do something }
};
};

关于C++从具有相同名称的成员的基类多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42214364/

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