2014-12-25 114 views
0

解决继承的抽象功能,问题是东西有点不同,对不起C++实现通过继承功能

我想实现的类组成工作在接口这样的工具:

class Interface 
{ 
    bool virtual use() = 0; 
} 

class Tool : public virtual Interface 
{ 
    void work() { use(); } 
} 

class InterfaceImplementation : public virtual Interface 
{ 
    bool use() { return DoSomethingUseful(); } 
} 

class TopClass : public Tool, public InterfaceImplementation 
{ 
    /* whatever using work() */ 
} 

的问题是, TopClass声称是抽象的。 正如我所看到的,工具因为接口而是抽象的,并且抽象函数被继承,这很好。在TopClass中定义的函数现在可以覆盖这些抽象函数,并使TopClass可以实例化(如果我尝试的话),为什么不是在定义这些重载函数时不会发生这种情况,而只是继承它们?

我想: 与继承的虚拟性和秩序的祖先(在TOPCLASS的定义)

只是为了记录播放:(几乎不相关) 的TOPCLASS有多种工具和接口是复杂的,这就是为什么虚拟继承。 我需要使用相同的InterfaceImplementation(一个大类)来定义多个类似TopClass的类(每个类都有不同的工具),所以我不能像上面提到的那样在TopClass中定义抽象函数。简单地说,我的设计有充分的意义:)

编辑: 上面的代码是编写的,这里是一个实际的代码,不会编译。这有点复杂,但问题是BuildRank在AIKBarnard中没有覆盖。

struct KPlugExt 
{ 
    bool virtual plug() = 0; 
}; 

struct KEvaluator : public virtual KPlugExt 
{ 
    virtual int BuildRank(Card card) = 0; 
}; 

struct KBarnardEvaluator : public virtual KPlugExt 
{ 
    int virtual BuildRank(Card card); 
}; 

struct KBarnardActions : public virtual KPlugExt, public virtual KEvaluator 
{ 
    /* stuff */ 
}; 

class AIKBarnard : public KBarnardActions, public KBarnardEvaluator 
{ 
public: 
    bool plug() { return false; } 
}; 
+3

无法重现。在将缺少的';'添加到类定义并使成员函数'public','TopClass t; t.work();'使用'-Wall -Wextra -pedantic -ansi'(和'-std = C++ 11')编译gcc 4.9.2和clang 3.5.0。 – Wintermute

+0

对不起,它是由代码组成的。我添加了直接从项目中提取的代码。 – user2828383

回答

1

在您的实际代码中,没有类实现纯虚拟方法BuildRankTR。因此,该层级中的每个班级都被认为是抽象的。

+0

对不起,这不是我原来的代码中的问题。让我的尝试再次提取有问题的部分,这次不那么着急......但谢谢。 – user2828383

0

对不起,我现在知道问题所在。如上所述,我的其中一个接口的实现缺少原始接口作为祖先,所以函数实际上并不是应有的重写。由于在这些发布的类之间存在许多级别,错误在代码中丢失,编译器指向定义中的错误位置。