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除非在类中声明方法,否则不能在类中定义方法。这与该类是否派生自任何东西无关。