找出父型向量元素的子型

时间:2019-02-21 08:52:45

标签: c++ vector polymorphism

我有一个名为“ Form”的抽象父类和一些子类,例如 “圆”和“星”。 如果我将这些子类的多个实例保存在父类型向量中,有什么办法可以找出单个元素的子类型?

//类

class Form {

public:
Form();
virtual ~Form() = default;
virtual  void Draw(CDC* pDC)abstract;

};

class Circle :public Form {
public:
Circle();
~Circle();

void Draw(CDC* pDC) override;
CPoint GetUpperLeft();
CPoint GetLowerRight();


private:
CPoint m_upperLeft;
CPoint m_lowerRight;
};

//主要

int main(){
std::vector<Form> m_forms;
m_forms.pushback(Circle());
m_forms.at(0);//??

}

2 个答案:

答案 0 :(得分:1)

也许不是理想的方法,而是一种简单的方法,即向父级添加一个在父级中返回true并在子级中覆盖它从而返回false的函数

class Form { 
public:
Form();
virtual ~Form() = default;
virtual  void Draw(CDC* pDC)abstract;
virtual bool isParent(){ return 1;}

};

class Circle :public Form {
public:
Circle();
~Circle();

void Draw(CDC* pDC) override;
CPoint GetUpperLeft();
CPoint GetLowerRight();
 bool isParent(){ return 0;}

private:
CPoint m_upperLeft;
CPoint m_lowerRight;
};

其次要注意的是,如果要在推向矢量的同时创建元素,则应使用:

m_forms.emplace_back(new Circle());

避免制作多余的副本

此外,您声明对象向量的方式

vector<Form> m_forms;
stores values, not references. 

vector<Form*> m_forms
Or, better yet:

vector< std::shared_ptr<Form> > m_forms

答案 1 :(得分:1)

按照@john的建议,您可以使用typeid()

我的一些代码证明了原理是...

#include <iostream>
#include <typeinfo>

struct Base
{
    virtual ~Base() {}
};

struct Derived : public Base
{
    virtual ~Derived() {}
};

struct Circle : public Base
{
    virtual ~Circle() {}
};


int main()
{
    Derived d;
    Circle c;
    Base *b1 = &d; 
    Base *b2 = &c;

    std::cout << typeid(*b1).name() << std::endl;
    std::cout << typeid(*b2).name() << std::endl;


}