虚拟函数未从接口继承
Virtual function not inherited from interface
我有一个带有默认实现的接口类和一个带有头和cpp文件的继承类。
List.h
class List {
public:
virtual int search(const string searchCharacters, bool caseSensitive){return 0;}
}
MyList.h
class MyList : public List {
}
MyList.cpp
int MyList::search(const string searchCharacters, bool caseSensitive)
{
// Implementation code
}
现在,由于某种原因,我得到了未在"MyList"中声明的成员函数。我有Java背景,但在适应C++的方式方面仍然存在一些问题。为什么定义没有通过MyList头文件进行?
您需要在派生类中声明函数:
class MyList : public List
{
public:
int search(const string searchCharacters, bool caseSensitive);
}
注意,在C++中,声明和定义是不一样的。在这种情况下,您不能在没有声明的情况下在cpp文件中定义成员函数。如果您不声明(并定义)它,那么派生类将从基类继承它,包括定义。
如果你想让它是多态的,你需要在基类中使它成为虚拟的,如果你要通过基类的指针使用它们,最好同时使析构函数成为虚拟的
class List
{
public:
virtual int search(const string searchCharacters, bool caseSensitive){return 0;}
virtual ~List() {}
}
正如@SergeyA所指出的,您也可以将其作为一个纯虚拟函数,使其与java风格的接口更加相似。在这种情况下,你不需要为它提供定义。(你仍然可以提供一个)
class List
{
public:
virtual int search(const string searchCharacters, bool caseSensitive) = 0;
virtual ~List() {}
}
最后,C++和Java是完全不同的。如果你想掌握C++,试着用C++风格思考。
与总是虚拟的Java非私有成员方法不同,C++成员函数是而不是虚拟的,除非您在基类中明确声明它为virtual
class List {
public:
virtual int search(const string searchCharacters, bool caseSensitive) {
return 0;
}
};
如果您想在cpp文件中提供重写的实现,还需要提供您在头中重写的成员函数的声明:
class MyList : public List {
public:
int search(const string searchCharacters, bool caseSensitive) override;
};
请注意声明末尾的可选override
说明符。
相关文章:
- Qt Quick - 如何在 qml 接口中使用继承自 QQuickPaintedItem 的 c++ 类?
- C++接口继承不同的参数方法
- c++ com 如何继承 IUIAutomationPropertyChangedEventHandler 接口
- C++ 使用接口和默认实现继承
- C++ 通过接口使用从其他几个类继承的类
- 如何在C++中访问 DirectWrite 继承的接口?
- 接口的钻石继承(C++)
- 将实现从继承的 CRTP 注入到继承的接口类
- C++:继承自基类和具有公共基接口的多个接口
- 接口实现和私有继承之间的交互
- 替代与djinni的接口继承
- C++ 接口类继承自具体类是否合理
- C++接口、继承、多态性
- C++与工厂的接口继承
- C 钻石接口继承
- C 接口继承
- 企业架构师 - 从类图中的接口继承方法
- 虚拟函数未从接口继承
- 抽象接口继承
- 嵌套接口继承实现