我有基类名称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方法?
答案 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)
清单:
您的构造函数是私有的,如果您想要派生和使用它们,请将它们公开。
在你的for循环中,增加i
,现在是无限循环
不确定您的编译器,但是如果控件在没有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; };
。