在其他类中使用抽象类的构造函数

时间:2014-01-22 14:13:16

标签: c++

我是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中工作并且我正在努力理解它。

通过对示例进行更正的解释非常有用,或者链接到一个好的教程。

由于

2 个答案:

答案 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;
}

遮蔽成员对象xy。你的意思是:

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 ++的书。