我有一个简单的抽象类(比如A)和继承它的类(比如C)。
class C : A
问题是第二个(C)包含我在另一个类中需要的代码;我认为将这部分代码拆分为单独的类(B)并从我需要的类中派生出来是很好的。
B(代码的共享部分)>> C(目标)<< A(C的抽象基础)
一切都好 - 除了在基类(A)中声明的抽象函数之一 在B中定义,不是C 。我认为这会导致我的错误。 我正在寻找解决方案......
class A // a base class i need to derive from
{
// ...
public: virtual bool Get() const;
// ...
};
class B // only contains definition for get()
{
public:
bool Get() const { return false; }
};
class C : public B, public A // firstly derive from B, than from A.. ??
{
// so Get(), required by A is defined in B, which C derives from ...
// and i cant derive from A because of that... I can't do that anyway?
};
我希望我描述正确..
答案 0 :(得分:5)
您可以选择与Get
语句一起使用的using
方法:
class C : public B, public A
{
public:
using B::Get;
};
这告诉编译器使用Get
类中的B
函数。
如果A
包含纯虚方法,则无效。
答案 1 :(得分:2)
如果您希望此工作正常B
应继承A
而C
应继承B
。
多重继承会导致歧义,例如您描述的歧义:A
具有抽象方法get()
,而B
具有相同的方法但已实现。由于A
和B
没有关系,因此在C
中继承哪个方法可能取决于A
中的get()仍未实现的事实。 (B
实现它的事实是无用的,因为B与A
没有任何关系
答案 2 :(得分:2)
如果A是抽象类,或者如果你想从接口A调用Get(),你需要重载虚函数:
class C : public B, public A
{
public:
virtual bool Get() const {
return B::Get();
}
};