gpt4 book ai didi

c++ - 我可以在 C++ 中做/模仿这样的事情(部分覆盖)吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:50 25 4
gpt4 key购买 nike

我有两个类 AB,它们都定义了方法 m()。虽然这些方法的签名相同,但它们是两种完全不同的方法,具有不同的含义。在 C 类中,我想同时更新 m()。而不是在 C 类中编写一个新的 m() 来融合来自 AB,我想分别覆盖它们。见以下代码:

class A { public: virtual void m() {cout << "MA" << endl;}};
class B { public: virtual void m() {cout << "MB" << endl;}};
class C : public A, public B {
public: virtual void m() update A {cout << "MA2" << endl;}};
public: virtual void m() update B {cout << "MB2" << endl;}};
}
void func(A* a) { a->m(); }
int main() {
C* c = new C();
c->B::m(); //print "MB2"
func(c); //print "MA2"
return 0;
}

我知道 C++ 不支持 update 语法,但是有什么解决方法可以在 C++ 中模拟它吗?

最佳答案

多重继承的一个令人讨厌的部分是,在 C 中确实只有一个 m 覆盖了两者。如果有 2 个或更多定义 m 的类,您需要一个中间人类来消除调用歧义。幸运的是,您可以使用模板来自动执行该过程:

template<class C>
class MiddleMan : public C {
void m() override final { m_impl(this); }
protected:
virtual void m_impl(MiddleMan*) = 0;
};

现在您只需使用此模板并覆盖它添加的新功能即可:

class C : public MiddleMan<A>, public MiddleMan<B> { 
private:
void m_impl (MiddleMan<A>*) override {cout << "MA2" << endl;}
void m_impl (MiddleMan<B>*) override {cout << "MA2" << endl;}
};

m 在每个中间人类中的实现将调用重载的新虚函数。然后定义这些重载。我使用 MiddleMan* 作为有助于重载的额外参数,但任何按值传递成本较低且依赖于模板参数的类型都可以消除歧义。

关于c++ - 我可以在 C++ 中做/模仿这样的事情(部分覆盖)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44632250/

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