gpt4 book ai didi

c++ - 创建基类指针的 vector ,并将派生类对象传递给它(多态性)

转载 作者:行者123 更新时间:2023-12-02 10:23:05 25 4
gpt4 key购买 nike

我正在尝试为我的Shape程序实现一个菜单。我已经实现了所有的形状类。如下是两个直接从抽象类“Shape”派生的,另外两个是从“Shape”派生的名为“Polygon”的类的,如下所示:

Shape -> Polygon -> Rectangle, Triangle
`-> Circle, Arrow

在菜单类中,我想创建某种数组,该数组可以包含指向对象的指针以及基类“Shape”的类型。但是我不确定如何正确地进行操作以及对所有形状都适用的方式,因为我的两个类不是直接从“Shape”派生的。

这是我的菜单类:
class Menu
{
protected:
//array of derived objects
public:

Menu();
~Menu();

// more functions..
void addShape(Shape& shape);
void deleteAllShapes();
void deleteShape(Shape& shape);
void printDetails(Shape& shape);
private:
Canvas _canvas; //Ignore, I use this program to eventually draw this objects to a cool GUI
};

在函数“addShape(Shape&shape);”中,我想使用该函数将每个给定的形状添加到数组中。如何实现向其添加新对象的功能?而且,如何检查给定对象是否来自“多边形”?因为如果是这样,就我所知,我需要以不同的方式调用成员函数。

最佳答案

我看到菜单中有一个数组,可以这样说:

Shape* myshapes[10];

形状可以是矩形,三角形,圆形等。
您想要的是能够使用菜单的printDetails()方法,如下所示:
    void printDetails()
{
for(int i = 0; i < size; i++)
{
cout << "Index " << i << " has " << myshapes[i]->getShapeName() << endl;
}
}

getShapeName()将返回一个字符串,例如如果是“矩形”,则为“矩形”。
您将可以在纯虚函数的帮助下执行此操作。纯虚函数必须在抽象类Shape中,该类具有:
virtual string getShapeName() = 0; //pure virtual

这意味着我们期望在派生类中对此函数进行定义。这样,您将能够通过使用shapes数组中的Shape指针使用getShapeName()方法,该方法将告诉您形状是Rectangle,Triangle还是Circle等。
class Shape
{
public:
virtual string getShapeName() = 0;
};

class Circle : public Shape
{
private:
int radius;

public:
Circle(int r) { radius = r; cout << "Circle created!\n"; }
string getShapeName() { return "Circle"; }
};

class Arrow : public Shape
{
private:
int length;

public:
Arrow(int l) { length = l; cout << "Arrow created!\n"; }
string getShapeName() { return "Arrow"; }
};

class Polygon : public Shape
{
public:
virtual string getShapeName() = 0;
};

class Triangle : public Polygon
{
private:
int x, y, z;

public:
Triangle(int a, int b, int c) { x = a; y = b; z = c; cout << "Triangle created!\n"; }
string getShapeName() { return "Triangle"; }
};

class Rectangle : public Polygon
{
private:
int length;
int width;

public:
Rectangle(int l, int w){ length = l; width = w; cout << "Rectangle created!\n"; }
string getShapeName() { return "Rectangle"; }
};

要实现addShape()方法,您可以执行以下操作:
void addShape(Shape &shape)
{
myshapes[count] = &shape;
count++;
}

另外,请记住在addShape()方法中通过引用或使用指针传递Shape。
希望对您有帮助...祝您好运:-)

关于c++ - 创建基类指针的 vector ,并将派生类对象传递给它(多态性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59217847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com