C++ C++';s纯虚拟函数实现和头文件

C++ C++';s纯虚拟函数实现和头文件,c++,inheritance,abstract,pure-virtual,C++,Inheritance,Abstract,Pure Virtual,当所讨论的类被划分为*.h和*.cpp文件时,我在实现从某个抽象类继承的纯虚拟函数时遇到了一些问题。编译器(g++)告诉我,由于纯函数的存在,派生类无法实例化 /** interface.h**/ namespace ns { class Interface { public: virtual void method()=0; } } /** interface.cpp**/ namespace ns { //Interface:

当所讨论的类被划分为
*.h
*.cpp
文件时,我在实现从某个抽象类继承的纯虚拟函数时遇到了一些问题。编译器(
g++
)告诉我,由于纯函数的存在,派生类无法实例化

/** interface.h**/
namespace ns
{
    class Interface {
        public:
            virtual void method()=0;
    }
}

/** interface.cpp**/
namespace ns
{
    //Interface::method()() //not implemented here
}

/** derived.h **/
namespace ns
{
    class Derived : public Interface {
        //note - see below
    }
}

/** derived.cpp **/
namespace ns
{
    void Derived::Interface::method() { /*doSomething*/ }
}

/** main.cpp **/
using namespace ns;
int main()
{
    Interface* instance = new Derived; //compiler error
}

这是否意味着我必须在接口的
*.h
派生的.h
中声明方法()两次?没有其他办法吗?

您忘记声明
派生::方法()

您至少尝试过定义它,但编写了
派生的::接口::方法()
,而不是
派生的::方法()
,但您甚至没有尝试声明它。因此它不存在

因此,
派生的
没有
方法()
,因此,
接口
中的纯虚拟函数
方法()
没有被覆盖。。。因此,
派生的
也是纯虚拟的,不能实例化

另外,
public void method()=0无效C++;它看起来更像Java。纯虚拟成员函数实际上必须是虚拟的,但您没有编写
virtual
。和访问说明符后跟一个冒号:

public:
    virtual void method() = 0;

您必须在子类中声明您的方法

// interface.hpp
class Interface {
public:
    virtual void method()=0;
}

// derived.hpp
class Derived : public Interface {
public:
    void method();
}

// derived.cpp
void
Derived::method()
{
    // do something
}

首先,没有理由有一个.cpp文件,其中唯一的东西是一个空白的名称空间。你不需要一个实现文件来填充一个抽象类。空洞可能是一个类型,也不是java。@ Time4To:实际上它不是有效的java,但是缺少冒号,暗示访问说明符已经被看作是连接到声明的东西,它比C++更接近于一个该死的景象。语法是我的错别字,请看我在开篇文章中的评论:)对不起。另外,
Derived::Interface::method()
是我试图定义应从接口继承的函数。我最初的问题是“我能实现(定义)继承的纯虚函数而不在派生类的
.h
文件中显式声明它吗?”。我这样做的原因是为了避免在类从多个接口继承时弄乱我的头文件,每个接口都包含几个纯虚拟的…@Neo:答案是no.:)@Thomalak Geret'kal:啊。遗憾(非常感谢你的帮助:)我想你的意思是声明(而不是定义)。@MikeSlutsky是的,我说了。@robert谢谢你的回答。你能解释一下原因吗?来自Java,不得不这么做似乎很肮脏。当我们在基接口中有许多派生的不同类和许多方法时,我们需要更改许多文件,以防基接口发生更改。@ManuelSelva除非在类中声明方法,否则不能在类中定义方法。这与该类是否派生自任何东西无关。