在子类中实现纯虚方法

Posted

技术标签:

【中文标题】在子类中实现纯虚方法【英文标题】:Implementing pure virtual method in subclass 【发布时间】:2014-03-08 21:23:21 【问题描述】:

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

当我尝试在 Eclipse 中实例化子类时,它会说

“派生”类型必须实现继承的纯虚方法“Base::compareTo”

我很确定我这样做了。我的基类是..

base.h

#ifndef BASE_H_
#define BASE

class Base
public:
    Base();
    virtual ~Base();
    virtual int compareTo(void* compare)=0;
;

#endif /* BASE*/

然后是我的derived.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_ */

派生的.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;


【问题讨论】:

你的错误信息是derived,你的代码是Derived(不同的拼写)。请发帖SSCCE! 您也不能动态投射 void*。我想你想要compareTo(Base* compare) 【参考方案1】:

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

您的 CDT 版本可能低于 8.2.1 吗?如果是这样,您可能会遇到应该在 8.2.1 中修复的 this bug。

不过,您的代码中还有另一个错误。你不能 dynamic_cast 一个 void 指针。

【讨论】:

如何查看我的 CDT 版本? FAQ_How_do_I_find_out_what_plug-ins_have_been_installed【参考方案2】:

试试这个基类代码:

#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;


【讨论】:

以上是关于在子类中实现纯虚方法的主要内容,如果未能解决你的问题,请参考以下文章

在某些派生类中实现虚函数的正确方法是啥?

抽象类

C++ 虚函数(virtual) 和纯虚函数(pure virtual) 的区别

解口的定义与实现

在运行时定义的 C++ 纯虚方法

关于C++的虚函数在父类的内部调用