抽象类和多态

ban*_*era 1 c++ polymorphism virtual clone

我正在研究抽象类的东西.

#include <iostream>
#include <vector>

using namespace std;

class Shape
{
protected:
    int m_size;
public:
    int getSize() { return m_size; }

    virtual bool isEqual(Shape *rhs) = 0;
};
Run Code Online (Sandbox Code Playgroud)

这是派生类之一:

class Circle : public Shape
{
public:
    Circle(int size) { m_size = size; }

    bool isEqual(Shape *rhs)
    {
        Circle* circle = dynamic_cast<Circle*>(rhs);

        if(circle == 0)
            return false; // not a Circle

        return m_size == circle->getSize();
    }
};
Run Code Online (Sandbox Code Playgroud)

我将所有形状存储在一个容器中(基本上是一个形状指针的向量).

class Container
{
private:
    vector<Shape*> v;
public:   
    ~Container()
    {
        for(int i = 0; i < v.size(); i++) {
            cout << "Removind element Nr. " << i << endl;
            delete v[i];
        }
        v.erase(v.begin(), v.end());
    }

    bool add(Shape *shape) 
    {
        for(int i = 0; i < v.size(); i++) {

            if( v[i] == shape ) { 
                return false;
            }

            if( v[i]->isEqual(shape) ) {
                return false;
            }

        }
        v.push_back(shape);
        return true;
    }

};
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在容器中添加元素而不将它们作为指针传递.目前它的工作原理如下:

Container c;
c.add(new Circle(10));
Run Code Online (Sandbox Code Playgroud)

我想以这种方式使用它:

C.add(Circle(10));
Run Code Online (Sandbox Code Playgroud)

什么是解决方案?

Dan*_*vil 5

不要按值存储多态对象.这可能导致对象切片.

在您的情况下,甚至不可能Shape按值存储类型的对象,因为该类具有纯虚方法.

如果您想要更好的资源管理,例如自动呼叫delete,您可以使用shared_ptrunique_ptr.

.