gpt4 book ai didi

C++ 多重继承 : Using base class A's implementation for abstract method of base class B

转载 作者:太空宇宙 更新时间:2023-11-04 15:31:29 24 4
gpt4 key购买 nike

我有一个抽象类 Interface 声明了 f()g() 方法。

MyClass实现了Interface::g()MyClass继承自Base,后者实现了自己的f()

如何使 Base::f() 成为 MyClassInterface::f() 的实现?

如果可能的话,我不想让 Base 直接从 Interface 继承。

class Interface {
public:
virtual void f() = 0;
virtual void g() = 0;
};

class Base {
public:
void f() { }
};

class MyClass : public Interface, public Base {
public:
void g() { }
};

int main() {
MyClass c;
c.f();
c.g();
}

这行不通,因为 fMyClass 中仍然是一个纯虚函数。

在 Java 中,我会使用以下方法,但它显然不适用于 C++。

public class MyClass extends Base implements Interface {
public static void main(String argv[]) {
MyClass c = new MyClass();
c.f();
c.g();
}
public void g() { }
}

class Base {
public void f() { }
}

interface Interface {
public void f();
public void g();
}

我要解决的具体问题如下:

上例中的Interface 是一个抽象类Sender,具有与发送 MIDI 消息相关的不同方法,例如update()(检查是否应该发送消息,必要时发送),以及 setAddress() 更改消息地址。消息是 MIDI 事件。我必须更改地址/ channel 以实现转置和选择不同库等功能。

Base 类是一个类Button。它有一个方法 update() 检查按钮是否被按下,并调用(虚拟)方法 press()release()相应。

MyClass 然后会实现 press()release() 方法,以便在按钮状态改变时发送正确的数据。

还有其他类型的 Sender,我将它们全部保存在一个列表中,以便同时 update() 它们,无论具体类型如何发件人。我还需要能够更改列表中所有 Sender 的地址(一次全部)。

setAddress() 方法与按钮无关,因此让 Button 继承自 Sender 没有意义.
还有其他类可以实现 Button,但它们不都是 Sender

也许我必须完全改变结构,但目前我真的没有看到更好的解决方案。

class Button {
public:
void update() {
if ( /* check in hardware whether button is pressed */ )
press();
}
virtual void press() = 0;
};

class Sender {
public:
virtual void update() = 0;
virtual void setAddress(int address) = 0;
};

class ButtonSender : public Button, public Sender {
public:
void update() {
Button::update();
}
void press() {
/* send a message */
}
void setAddress(int address) {
/* change the address */
}
};

int main() {
ButtonSender bs;
Sender *s = &bs;
s->update();
}

最佳答案

要完成这项工作,您必须覆盖 MyClass 中的 f():

class MyClass : public Interface, public Base {
public:
void f() {
Base::f();
}
void g() {
cout << "MyClass::g()" << endl;
}
};

关于C++ 多重继承 : Using base class A's implementation for abstract method of base class B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090314/

24 4 0
文章推荐: c++ - 指针作为类变量 Qt
文章推荐: HTML:设置 4
文章推荐: asp.net -
的间距问题
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com