如何在派生类上执行派生的类成员
How to enforce derived class members on derived classes
一个人如何执行派生类以具有特定派生类型的成员数据。
即,
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> {};
此外,您可以添加一个附加的非模板基础,以便Architect
和Writer
是同一层次结构的一部分,但是该非网板基础无法与projs
成员打交道。
如果不是模板,则必须依靠运行时检查。为此,Project
必须是多态类型,并且必须使用typeid
或dynamic_cast
来执行不变性。而且,您必须首先使用间接时间存储Project
的s。std::vector<Project>
不能存储任何Building
和Article
对象,因为它仅存储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());
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 在 C++ 中用派生类型重写成员函数
- 如果基类包含双指针成员,则派生类的构造函数
- 在派生类中绑定非静态模板化成员函数
- 为什么基指针可以访问虚拟函数中的派生成员变量
- 在销毁派生成员之前,在破坏者中调用共同功能
- 带有派生成员的基类的独特指针
- 为什么基类对象的私有成员仍然从派生成员中分配
- 派生成员函数指针的多态性
- 派生成员和重载Ostream运算符
- 通过指向派生类的指针访问派生成员变量
- 在构造过程中是否有一种简洁的方法可以派生成员的类型?
- 如何使用派生类特定的方法:派生类中的派生成员
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权
- 当我使用根据基类定义的成员函数指针时,编译器如何调用派生成员函数?
- 将luabind派生成员调用为协同程序
- C++ POD 结构继承?是否有任何关于派生成员的内存布局的保证