在通过继承实现纯抽象类,使用名称空间包装所有类以避免与其他类冲突时需要帮助。
如果从抽象类和从纯抽象类继承的所有类中删除名称空间包装器,则能够成功构建并运行代码。
好像Visual Studio 2010编译器抱怨说,尽管所有类都在同一个命名空间中,但是抽象类的纯抽象方法却没有实现。
任何帮助将非常感激。
//IBaseClass.h
//forward declaration
class ConcreteClass;
//namespace MyCustomNamespace
//{
class IBaseClass
{
public:
virtual ~IBaseClass() { /*virtual destructor*/ }
//Behaviours...
virtual bool Method001( const ConcreteClass &cc ) = 0;
//virtual bool Method002(/*some input*/) = 0;
};
//} /*NAMESPACE*/
//-----------------------------------------
//ParentClass.h
//namespace MyCustomNamespace
//{
class ParentClass : virtual public IBaseClass
{
private:
int a;
public:
virtual ~ParentClass() { /*virtual destructor*/ }
//getter-setter implemented in ParentClass.cpp file...
void setA(const int aa);
const int getA() const;
};
//} /*NAMESPACE*/
//-----------------------------------------
//ConcreteClass.h
//namespace MyCustomNamespace
//{
class ConcreteClass: public ParentClass
{
private:
int b;
public:
virtual ~ConcreteClass() { /*virtual destructor*/ }
//getter-setter...
void setB(const int bb);
const int getB() const;
bool Method001( const ConcreteClass &cc ); //re-declaring IBase abstract method...
};
//} /*NAMESPACE*/
//-----------------------------------------
//ConcreteClass.cpp
//namespace MyCustomNamespace
//{
void ConcreteClass::setB(const int bb) { this->b = bb; }
const int ConcreteClass::getB() const { return this->b; }
bool ConcreteClass::Method001( const ConcreteClass &cc )
{
//implementation code goes here...
return false;
}
//} /*NAMESPACE*/
最佳答案
问题在于您的转发类已在另一个名称空间(特别是全局名称空间)中声明。因此,要覆盖的虚拟是具有不同参数类型的不同符号。
如所写,编译器将ConcreteClass
与在基声明中在全局命名空间中看到的前向声明进行匹配:
virtual bool Method001( const ConcreteClass &cc ) = 0;
在
Method001
中声明ConcreteClass
时:virtual bool Method001( const ConcreteClass &cc );
编译器将
cc
与MyCustomNamespace::ConcreteClass
匹配,因为这是更准确的匹配。要解决此问题,只需将您的前向声明放在适当的名称空间中:
namespace MyCustomNamespace {
class ConcreteClass;
}