我有类似的东西(简化)
class A
{
public:
virtual void Function () = 0;
};
class B
{
public:
virtual void Function () = 0;
};
class Impl : public A , public B
{
public:
????
};
如何实现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; }
};
谢谢!
答案 0 :(得分:31)
您不能在那里使用限定名称。我写void Function() { ... }
你正在覆盖两个函数。 Herb Sutter显示how it can be solved。
另一种选择是重命名这些功能,因为显然他们做了不同的事情(否则我没有看到覆盖两者具有相同行为的问题)。
答案 1 :(得分:2)
作为解决方法,请尝试
struct Impl_A : A
{
void Function () { cout << "A::Function" << endl; }
};
struct Impl_B : B
{
void Function () { cout << "B::function" << endl; }
};
struct Impl : Impl_A, Impl_B {};
答案 2 :(得分:2)
我可以建议另一种解决此问题的方法。您可以通过添加伪参数来添加更改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;
}
};
这种解决方案的好处是所有实现都放在一个类中。
答案 3 :(得分:-1)
如果A和B是接口,那么我将使用虚拟推导来“连接”它们(使它们重叠)。如果您通过指向Function
或A
的指针调用B
需要不同的实现,那么我强烈建议您选择其他设计。否则会受到伤害。
Impl
“源自”A
而B
表示Impl
“是”A
和B
。我想你不是故意的。
Impl
“实现界面”A
而B
表示Impl
“的行为类似于”A
和B
。那么相同的界面应该意味着相同的行为。
在两种情况下,根据使用的指针类型具有不同的行为将是“精神分裂症”,并且肯定是要避免的情况。