2014-02-23 86 views
2

我有我的基类Gate,而派生类是AND(XOR等)。我在基类中使用的虚函数用于确定输出,但是当我在AND.h中原型化并尝试使用AND.cpp实现时,我在编译时遇到了重定义错误。我确信我已经正确地包括了一切。重新定义类函数错误C++

门头

#ifndef GATE_H 
#define GATE_H 

class Gate{ 
    public: 
     // various functions etc. 

     virtual bool output(); // **PROBLEM FUNCTION** 

}; 

#endif 

门源

#include "Gate.h" 

//*various function declarations but not virtual declaration* 

派生类 “和”

#ifndef AND_H_INCLUDED 
#define AND_H_INCLUDED 

class AND: public Gate{ 
public: 
    bool output(bool A, bool B){} 
}; 
#endif // AND_H_INCLUDED 

,并在我的IDE把我的错误发生的历史在AND.h文件

#include "AND.h" 

bool AND::output(bool A, bool B){ 
    if (A && B == true){ 
     Out = true; 
    } else { 
     Out = false; 
    } 

    return Out; 
} 

在这种情况下是一个继承变量。

+0

你'和'头应该包括它来编译需要的人。 – chris

+1

就我而言,你不能声明一个没有参数的函数,然后用参数重新定义它。 – Mauren

+0

@Mauren,在这种情况下,它会被遮蔽。 – chris

回答

2

您提供了两个定义AND::output。一个在头文件中,它是空的,另一个在实现文件中,它不是空的。看起来像你的头应该有:

bool output(bool A, bool B); 

请注意,您将不能因为他们不具有相同的参数声明中Gate到多态使用这些output功能。

+0

我的标题是否有你在公众中指定的内容:条款。我认为虚拟函数被传递给派生类,然后可以定义它们? – user3344556

+0

@ user3344556,只有签名匹配时(大致上,因为返回类型也需要)。 – chris

+0

@ user3344556不,它不。再检查一遍。克里斯说了什么。 –

2

您在AND类定义定义方法AND::output这里:

bool output(bool A, bool B){} // this is a definition 

和你在这里重新定义它:

bool AND::output(bool A, bool B){ 

    if (A && B == true){ 
    .... 

你可以通过改变前者的声明解决这个问题:

bool output(bool A, bool B); 
+0

啊,因为这更清楚约瑟说什么 – user3344556

1

如前所述,您已经定义了两次函数输出:头文件和cpp模块。同样,这个函数并不是虚拟的,因为它的数量和参数类型不会在基类中声明具有相同名称的虚函数。

我想追加该功能可以定义更简单

bool AND::output(bool A, bool B) 
{ 
    return (Out = A && B); 
}