c++ - 如何识别从不同子类覆盖的向量类?
问题描述
我想确定哪些子类初始化向量中的指针。
我准备了一个包含不同类型覆盖类的向量。之后,我将其设置为同一函数中的参数。在函数中,我想确定哪些类初始化了这个参数并为每个类应用不同的过程。
这是代码和当前输出。
#include <memory>
#include <iostream>
#include <vector>
class Parent
{
public:
Parent() {};
virtual ~Parent() {};
virtual void print()
{
std::cout << "I am parent!" << std::endl;
}
};
class ChildA : public Parent
{
public:
ChildA() {};
~ChildA() {};
void print() override
{
std::cout << "I am child A!" << std::endl;
}
};
class ChildB : public Parent
{
public:
ChildB() {};
~ChildB() {};
void print() override
{
std::cout << "I am child B!" << std::endl;
}
};
void func(std::unique_ptr<Parent>& pa)
{
pa->print();
//if (pa is initialized from Parent)
//{
//}
//if (pa is initialized from ChildA)
//{
//}
//if (pa is initialized from ChildB)
//{
//}
return;
}
int main(int argc, char** argv)
{
std::unique_ptr<Parent> pa = std::make_unique<Parent>();
std::unique_ptr<ChildA> chA = std::make_unique<ChildA>();
std::unique_ptr<ChildB> chB = std::make_unique<ChildB>();
std::vector<std::unique_ptr<Parent>> mList;
mList.push_back(std::move(pa));
mList.push_back(std::move(chA));
mList.push_back(std::move(chB));
for (auto& l : mList)
func(l);
return 0;
}
输出
I am parent!
I am child A!
I am child B!
你能告诉我任何想法吗?谢谢你。
解决方案
使用虚函数编写多态代码的目的通常是为了避免进行“这是一个 X”风格的测试。相反,您在基类中创建一个虚函数doSpecialStuff
并通过基类指针调用它(就像print
在您的代码中一样),然后对每个派生类执行适当的操作。
如果您真的想测试类型,请使用dynamic_cast
:
if(auto child_ptr=dynamic_cast<ChildA*>(pa.get())){
child_ptr->child_A_function();
}
推荐阅读
- java - 如何将此 xml 响应映射到 java 对象
- python - 如果在遍历 pandas 中的多个文件时满足条件,如何跳过 for 循环迭代?
- c# - C# - 使用多个图片框处理鼠标位置
- dart - Dart GRPC 生成的类可以有自定义的 mixin 吗?
- django - CAS django - 如何直接发送用户名和密码而不重定向到 CAS 服务器 -
- javascript - RxJS takeLast 函数停止一切
- r - 应用 max.col 后如何从每个列表级别检索行名
- css - 使用 CSS 进行 XML 装饰
- javascript - 如何配置 Sequelize ORM 以执行序列化查询
- webpack-5 - 模块解析失败:更新到 Angular 12 后出现意外字符“�”