QbP*_*rog 20 c++ virtual overriding diamond-problem
我有类似的东西(简化)
class A
{
public:
virtual void Function () = 0;
};
class B
{
public:
virtual void Function () = 0;
};
class Impl : public A , public B
{
public:
????
};
Run Code Online (Sandbox Code Playgroud)
如何为A实现Function()和为B实现Function()?Visual C++允许您只定义内联的特定函数(即不在cpp文件中),但我认为它是一个扩展.海湾合作委员会抱怨这一点.是否有标准的C++方式告诉编译器我要覆盖哪个函数?
(visual c ++ 2008)
class Impl : public A , public B
{
public:
void A::Function () { cout << "A::Function" << endl; }
void B::Function () { cout << "B::Function" << endl; }
};
Run Code Online (Sandbox Code Playgroud)
谢谢!
小智 5
我可以建议另一种方法来解决这个问题。您可以通过添加虚拟参数来添加Typed更改Function签名的包装器。因此,您可以区分实现中的方法。
class A {
public:
virtual void Function() = 0;
virtual ~A() = default;
};
class B {
public:
virtual void Function() = 0;
virtual ~B() = default;
};
template<typename T>
class Typed : public T {
public:
virtual void Function(T* dummy) = 0;
void Function() override {
Function(nullptr);
}
};
class Impl : public Typed<A>, public Typed<B> {
public:
void Function(A* dummy) override {
std::cerr << "implements A::Function()" << std::endl;
}
void Function(B* dummy) override {
std::cerr << "implements B::Function()" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
这种解决方案的好处是所有实现都放在一个类中。