class IA
{
public:
virtual void a() = 0;
};
class A: public IA
{
public:
virtual void a()
{
}
};
class IB
{
public:
virtual void b() = 0;
};
class B: public IB, public A
{
public:
virtual void b()
{
}
};
void f(IA* p)
{
}
int main()
{
B b = B();
IB* p = &b;
f(p);
}
这是在C ++中实现具有继承的接口的正确方法吗?如果是这样,我如何在代码中获取行f(p);
进行编译?基本上,我希望如果IB
可以继承IA
,但这会导致B出现问题。
更新
我希望IB
包含IA
的界面,如下所示。但是,由于IA::a()
和A::a()
相互冲突,因此此代码无法编译。我该怎么办?
class IA
{
public:
virtual void a() = 0;
};
class A: public IA
{
public:
virtual void a()
{
}
};
class IB : public IA
{
public:
virtual void b() = 0;
};
class B: public IB, public A
{
public:
virtual void b()
{
}
};
更新2
这个编译,看起来是否正确?我是否需要所有这些虚拟
class IA
{
public:
virtual void a() = 0;
};
class A: virtual public IA
{
public:
virtual void a()
{
}
};
class IB: virtual public IA
{
public:
virtual void b() = 0;
};
class B: virtual public IB, public A
{
public:
virtual void b()
{
}
};
答案 0 :(得分:5)
嗯,这当然是正确的方法,但是行f(p)
不应该按原样编译,想象实现IB
的类,但不实现IA
,这是可能的,所以你不能假设他们都实现了IA
。如果你想假设,你可以从IB
继承IA
,但这是另一种设计。它可以像这样实现:
class IA
{
public:
virtual void a() = 0;
};
class A: virtual public IA
{
public:
virtual void a()
{
}
};
class IB : virtual public IA
{
public:
virtual void b() = 0;
};
class B: public IB, public A
{
public:
virtual void b()
{
}
};