我是cpp的新手,到目前为止,我有以下内容:
形状hpp:
class Shape
{
public:
Shape(int x, int y);
~Shape();
virtual void area();
bool positive(int x, y);
private:
int x;
int y;
};
形状cpp:
Shape::Shape(int x, int y)
{
x = x;
y = y;
}
bool Shape::positive(int x, int y)
{
return true;
}
Square hpp:
class Square : public Shape
{
private:
virtual void area();
};
和Square cpp:
#include <iostream>
using namespace std;
void Shape::area()
{
cout << "Temp" << endl;
}
我正试图从Main调用代码:
Square sq;
sq.area();
这不起作用,我知道我错过了与Square类的构造函数有关的事情但是我不确定继承如何在cpp中工作并且我正在努力理解它。
通过对示例进行更正的解释非常有用,或者链接到一个好的教程。
由于
答案 0 :(得分:3)
您在Shape.cpp中定义Shape::area
而不是Square::area
。将void Shape::area()
替换为void Square::area()
。
此外,您尝试使用默认构造函数实例化Square
对象,即使它没有。使用:
Square sq(a, b);
代替,或定义一个。
尽量避免使用using namespace std
并习惯std::
前缀。它将来会很有用。
最后,我没有看到virtual void Shape::area()
的任何定义。你可能想要声明它纯虚拟:
virtual void area() = 0;
在本文中,Shape
的析构函数应声明为虚拟:
virtual ~Shape();
如果您打算以多态方式使用该类。
您还没有定义Square
的构造函数,这是必需的,因为默认构造函数不再可行(因为Shape
中没有可用的)。只需定义一个这样的:
class Square {
public:
Square(int x, int y) : Shape(x, y) {}
// ...
};
上面的构造函数会将子对象Shape
的构造委托给正确的构造函数。
更不用说:
Shape::Shape(int x, int y)
{
x = x;
y = y;
}
您遮蔽成员对象x
和y
。你的意思是:
Shape::Shape(int x, int y)
{
this->x = x;
this->y = y;
}
答案 1 :(得分:2)
您的所有代码都充满了错误。 例如,您忘了为此函数
中的第二个参数指定类型说明符bool positive(int x, y);
应该是
bool positive(int x, int y);
此构造函数
Shape::Shape(int x, int y)
{
x = x;
y = y;
}
不初始化数据成员x和y。相反,它只是重新分配参数x和y。构造函数应该写成
Shape::Shape(int x, int y)
{
this->x = x;
this->y = y;
}
或
Shape::Shape(int x, int y) : x( x ), y( y ) {}
Class Square应该有一个带有两个参数的构造函数,它可以将这些参数删除到它的基类构造函数中。例如
Square( int x, int y ) : Shape( x, y ) {}
还要考虑到您没有抽象类。抽象类是一个具有纯虚函数的类。如果您将虚函数square声明为
,则您的类Shape可以是一个抽象类virtual void area() = 0;
我建议你为初学者阅读一些关于C ++的书。