1

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

我希望我描述的正确..

4

3 回答 3

5

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

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

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

A但是,如果包含纯虚拟方法则无济于事。

于 2013-07-24T12:16:32.943 回答
2

如果您希望它正常工作B应该继承自A并且C应该继承自B.

多重继承会导致歧义,例如您所描述的:A具有抽象方法get()并且B具有相同的方法但已实现。既然AB没有关系,那么继承哪个方法C可能取决于A仍然没有实现 get() 的事实。(实现它的事实B是无用的,因为 B 与 没有任何关系A

于 2013-07-24T12:16:41.430 回答
2

如果A是抽象类,或者如果你想从接口A调用Get(),你需要重载虚函数:

class C : public B, public A
{
public:
    virtual bool Get() const {
        return B::Get();
    }
}; 
于 2013-07-24T12:23:25.663 回答