在派生类中重新定义基类方法

时间:2016-11-23 17:03:04

标签: c++

我有基类名称foo_base

class foo_base {

    foo_base(){};
    ~foo_base(){};

    virtual int counter(){};
};

class foo_derived : public foo_base{

    foo_derived(){};
    ~foo_derived(){};

    int counter() {   int temp = 0;
            for(int i = 0; i < 10;)
                temp += i;
            return temp;
            }
};


int main(){

int numbers  = 0;

foo_base * foo_base_ptr;
foo_base_ptr = new foo_derived();

numbers = foo_base_ptr->counter();   /*error */


delete foo_base_ptr;

return 0;
}

当我尝试编译程序时出现了这个错误:

error C4716: 'foo_base::counter' : must return a value  

我想在foo_drived中定义counter()。我怎样才能做到这一点? 有没有办法在foo_derived类中重新定义foo_base方法?

4 个答案:

答案 0 :(得分:1)

内部

class foo_base {

    foo_base(){};
    ~foo_base(){};

    virtual int counter(){};
};

counter定义一个不返回整数的函数。更改为(基类将返回0,派生将重写):

class foo_base {

    foo_base(){};
    ~foo_base(){};

    virtual int counter(){return 0;};
};

它应该编译

答案 1 :(得分:1)

你需要让基类中的counter()函数返回一个int。您定义了函数的返回类型,但没有提供函数的正确定义。这应该解决那个问题,但你也有其他问题。

定义类时,不能将描述符标记为私有。在C ++中,与Java不同,变量&amp;默认情况下,函数是“私有的”。您需要明确将成员标记为公开,以便将其公开。

解决您的第一个问题:

`virtual int counter(){ return 0 }; //It doesn't have to return 0, just an int. Used this for demo sake'

解决第二个问题:

class foo_base {
public: // This will make everything below public, so only do this if your goal is to have everything marked as public (i.e. use private where necessary)
    foo_base(){};
    ~foo_base(){};

    virtual int counter(){};
};

class foo_derived : public foo_base{
public:
    foo_derived(){};
    ~foo_derived(){};

    int counter() {   int temp = 0;
        for(int i = 0; i < 10;)
            temp += i;
        return temp;
        }
};

如代码中所述,必要时使用public。但是,在此场景中将构造函数标记为私有(根据显示的代码)是没有意义的。再次,这是你的选择。但是,析构函数必须标记为public才能继承。

答案 2 :(得分:1)

清单:

  1. 您的构造函数是私有的,如果您想要派生和使用它们,请将它们公开。

  2. 在你的for循环中,增加i,现在是无限循环

  3. 不确定您的编译器,但是如果控件在没有return语句的情况下到达函数末尾,则大多数编译器都不会抛出错误,它会显示警告。但是,如果您看到错误,则应return 0或其他东西使编译器满意。

答案 3 :(得分:0)

您无法在counter()中为foo_base课程实施foo_derived功能。您可能想要的是:(1)使基类抽象或(2)在foo_base中为counter()提供实现。

但是,如果您将counter()定义为不是纯虚拟(即virtual int counter() = 0;,编译器会抱怨,因为您需要实现。 一种选择是将virtual int counter(){};替换为virtual int counter(){ return 0; };