如何识别从不同的 child 类 覆盖的向量 类?
How to identify the vector classes which override from different child classes?
我想确定哪些 child class 初始化向量中的指针。
我准备了一个向量,其中包含不同类型的覆盖 classes。之后,我将它设置为同一个函数中的参数。在函数中,我想确定哪些 classes 初始化了这个参数并为每个 class.
应用不同的过程
这是代码和当前输出。
#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!
你能告诉我任何想法吗?
谢谢。
使用虚函数进行多态代码的目的通常是为了避免进行 "is this an X" 样式测试。相反,您在基 class 中创建一个虚函数 doSpecialStuff
并通过基 class 指针调用它(如代码中的 print
),然后执行适当的操作每个派生 class.
如果你真的想测试类型,使用dynamic_cast
:
if(auto child_ptr=dynamic_cast<ChildA*>(pa.get())){
child_ptr->child_A_function();
}
我想确定哪些 child class 初始化向量中的指针。
我准备了一个向量,其中包含不同类型的覆盖 classes。之后,我将它设置为同一个函数中的参数。在函数中,我想确定哪些 classes 初始化了这个参数并为每个 class.
应用不同的过程这是代码和当前输出。
#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!
你能告诉我任何想法吗? 谢谢。
使用虚函数进行多态代码的目的通常是为了避免进行 "is this an X" 样式测试。相反,您在基 class 中创建一个虚函数 doSpecialStuff
并通过基 class 指针调用它(如代码中的 print
),然后执行适当的操作每个派生 class.
如果你真的想测试类型,使用dynamic_cast
:
if(auto child_ptr=dynamic_cast<ChildA*>(pa.get())){
child_ptr->child_A_function();
}