如何在派生类上执行派生的类成员

How to enforce derived class members on derived classes

本文关键字:派生 成员 执行      更新时间:2023-10-16

一个人如何执行派生类以具有特定派生类型的成员数据。

即,

class Project {
  public:
    int projdata;
};
class Article: public Project {
};
class Building: public Project {
};
class Emplooyee {
  public:
    std::vector<Project> projs;
}
class Architect: public Employee {
};
class Writer: public Employee {
};

我现在如何强制执行建筑师对象只有类型的建设项目,而小说家只有类型文章的项目?即,我想拥有

之类的东西
class Architect: public Employee {
  public:
    std::vector<Building> projs;
};

class Novelist: public Employee {
  public:
    std::vector<Article> projs;
};

我还可以将指针存储到项目中,然后将其存储在正确的类型中。是否有技术或设计模式可以在派生类的成员上执行此类相应的继承规则?

编译时间解决方案是使基础成为模板:

template<class Proj>
class Emplooyee {
  public:
    std::vector<Proj> projs;
}
class Architect: public Employee<Building> {};
class Writer: public Employee<Article> {};

此外,您可以添加一个附加的非模板基础,以便ArchitectWriter是同一层次结构的一部分,但是该非网板基础无法与projs成员打交道。

如果不是模板,则必须依靠运行时检查。为此,Project必须是多态类型,并且必须使用typeiddynamic_cast来执行不变性。而且,您必须首先使用间接时间存储Project的s。std::vector<Project>不能存储任何BuildingArticle对象,因为它仅存储Project对象

就像您提到的那样,您可以将多态性指针存储在基类中:

class Employee {
  public:
    std::vector<Project*> projs;
}

并使用 dynamic_cast降低它们:

dynamic_cast<Building*>(projs[i])->doSomething();

,但我不建议这种方法(除非必要(,因为这将要求您管理这些指针背后的记忆。(例如,可以将哪个可以从std::unique_ptr上卸载。(

除非您要求员工成为多态性类,否则更简单的方法是使用类模板

template <typename T>
class Employee {
public:
    std::vector<T> projs;
}

可以像这样使用:

class Architect : public Employee<Building> {
};
Architect architect;
architect.projs.push_back(Building());