在子类中实现纯虚方法

Implementing pure virtual method in subclass

本文关键字:方法 实现 子类      更新时间:2023-10-16

我正在子类中实现父类的纯虚函数。

当我尝试在eclipse中实例化子类时它显示

类型'derived'必须实现继承的纯虚方法'Base::compareTo'

我很确定我是这么做的。我的基类是…

base.h

#ifndef BASE_H_
#define BASE
class Base{
public:
    Base();
    virtual ~Base();
    virtual int compareTo(void* compare)=0;
};
#endif /* BASE*/

那么我的导数。h

#ifndef DERIVED_H_
#define DERIVED_H_
#include "Base.h"
class Derived : public Base {
public:
    int x;
    Derived(int y);
    virtual ~Derived();
    int compareTo(void* compare);
};
#endif /* DERIVED_H_ */

Derived.cpp

#include "Derived.h"
#include "Base.h"
Derived::Derived(int y) {
    // TODO Auto-generated constructor stub
        x=y;
}
Derived::~Derived() {
    // TODO Auto-generated destructor stub
}
int Derived::compareTo(void* compare) {
    Derived* compared;
    int result=0;
    if(compared=dynamic_cast<Derived*>(compare))
    {
        if(x<compared->x)
        {
            result=-1;
        }
        else
        {
            result=1;
        }
    }
    return result;
}

我假设此消息来自eclipse代码分析器,而不是来自编译器。代码分析器是错误的,你是正确的。您已经从Derived中的基类正确地实现了纯虚方法。如果您尝试实例化Derived,代码应该可以编译。

您的CDT版本可能小于8.2.1?如果是这样,你可能会遇到这个错误,应该在8.2.1中修复。

你的代码中还有一个bug。不能动态强制转换void指针

试试下面的基类代码:

#ifndef BASE_H_
#define BASE_H_
class Base{
public:
    //Base (); not needed in the virtual class
    virtual ~Base() {};
    virtual int compareTo(void* compare)=0;
};
#endif /* BASE*/
#ifndef DERIVED_H_
#define DERIVED_H_
#include "Base.h"
class Derived : public Base {
public:
    int x;
    Derived(int y);
    virtual ~Derived();
    int compareTo(void* compare) override/*C++11*/;
};
#endif /* DERIVED_H_ */
#include "Derived.h"
//#include "Base.h" Not needed
Derived::Derived(int y) {
    // TODO Auto-generated constructor stub
        x=y;
}
Derived::~Derived() {
    // TODO Auto-generated destructor stub
}
int Derived::compareTo(void* compare) {
    Derived* compared;
    int result=0;
    if(compared=dynamic_cast<Derived*>(compare))
    {
        if(x<compared->x)
        {
            result=-1;
        }
        else
        {
            result=1;
        }
    }
    return result;
}