在通过继承实现纯抽象类,使用名称空间包装所有类以避免与其他类冲突时需要帮助。

如果从抽象类和从纯抽象类继承的所有类中删除名称空间包装器,则能够成功构建并运行代码。

好像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 );


编译器将ccMyCustomNamespace::ConcreteClass匹配,因为这是更准确的匹配。

要解决此问题,只需将您的前向声明放在适当的名称空间中:

namespace MyCustomNamespace {
  class ConcreteClass;
}

08-25 08:52
查看更多