“无法实例化抽象类”错误

时间:2013-07-24 12:13:36

标签: c++ oop

我有一个简单的抽象类(比如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?
};

我希望我描述正确..

3 个答案:

答案 0 :(得分:5)

您可以选择与Get语句一起使用的using方法:

class C : public B, public A
{
public:
    using B::Get;
};

这告诉编译器使用Get类中的B函数。

如果A包含纯虚方法,则无效。

答案 1 :(得分:2)

如果您希望此工作正常B应继承AC应继承B

多重继承会导致歧义,例如您描述的歧义:A具有抽象方法get(),而B具有相同的方法但已实现。由于AB没有关系,因此在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();
    }
};