我正在使用CodeBlocks,我有以下不编译的代码。
(这是关于一些C ++的陷阱,所以我唯一要问的是为什么它不能编译)
代码如下:
#include <iostream>
using namespace std;
class Shape
{
public:
Shape();
virtual void reset();
private:
int color;
};
class Point : public Shape
{
private:
double a,b;
};
void Shape::reset()
{
cout<<"Shape reset\n";
}
void Point::reset()
{
Shape::reset();
cout<<"Point reset";
}
Shape::Shape()
{
reset();
}
int main()
{
Shape s;
Point o;
}
我收到以下错误:
no `void Point::reset()' member function declared in class `Point'
答案 0 :(得分:6)
您需要向Point
班级主体添加该函数的声明:
class Point : public Shape
{
public:
virtual void reset();
private:
double a,b;
};
(virtual
是不必要的,因为它在基类中声明为virtual
。但将它添加为提醒会很有帮助。)
答案 1 :(得分:0)
应该这样声明:
class Shape
{
public:
Shape();
virtual void reset(){};
private:
int color;
};
注意括号,因为虚函数什么都不做,你可以在声明中添加括号。由于它是一个虚函数,因此在继承基类时可以重新定义。因此无法真正调用Shape::reset()
函数中的Point::reset()
。同样在您的Point
课程中,您需要重新定义新功能。像这样:
class Point : public Shape
{
public:
void reset();
}
然后您可以将该功能用作Point::reset
。