我有一个名为“ 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);//??
}
答案 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;
}