我怎样才能拥有基本 class 对象的列表并访问派生的 class 字段?
How can I have a list of base class objects and access derived class fields?
假设我有一个基础 class 和两个派生的 classes:
class a {};
class b : a { int a; };
class c : a { int b; };
我有一个基数 class 的列表,我将派生的 class 插入到列表中:
std::list<a> list;
list.emplace_back(b());
list.emplace_back(c());
现在,我想像这样访问 int a
:
for(auto i : list)
{
i.a = 5;
}
我已经检查过 class 它是什么,但编译器仍然不允许我访问它。
如何从基础 class 访问派生 class 中的任何字段?
这个问题已经被问过很多次了,但是到目前为止 none 的方法对我有用。
首先,你需要一个基class指针的列表,否则当你将它们插入列表时你将slice the objects。
然后,您需要根据需要对指针进行类型转换以访问派生的 classes。
如果所有列表元素都指向相同的派生类型,您可以使用 static_cast
:
struct A {};
struct B : A { int a; };
struct C : A { int b; };
std::list<std::unique_ptr<A>> lst;
lst.push_back(std::make_unique<B>());
lst.push_back(std::make_unique<B>());
for(auto &ptr : lst)
{
static_cast<B*>(ptr.get())->a = 5;
}
否则,在访问其字段之前使用 dynamic_cast
来测试派生的 class 类型:
struct A {};
struct B : A { int a; };
struct C : A { int b; };
std::list<std::unique_ptr<A>> lst;
lst.push_back(std::make_unique<B>());
lst.push_back(std::make_unique<C>());
for(auto &ptr : lst)
{
B *b = dynamic_cast<B*>(ptr.get());
if (b)
b->a = 5;
}
假设我有一个基础 class 和两个派生的 classes:
class a {};
class b : a { int a; };
class c : a { int b; };
我有一个基数 class 的列表,我将派生的 class 插入到列表中:
std::list<a> list;
list.emplace_back(b());
list.emplace_back(c());
现在,我想像这样访问 int a
:
for(auto i : list)
{
i.a = 5;
}
我已经检查过 class 它是什么,但编译器仍然不允许我访问它。
如何从基础 class 访问派生 class 中的任何字段?
这个问题已经被问过很多次了,但是到目前为止 none 的方法对我有用。
首先,你需要一个基class指针的列表,否则当你将它们插入列表时你将slice the objects。
然后,您需要根据需要对指针进行类型转换以访问派生的 classes。
如果所有列表元素都指向相同的派生类型,您可以使用 static_cast
:
struct A {};
struct B : A { int a; };
struct C : A { int b; };
std::list<std::unique_ptr<A>> lst;
lst.push_back(std::make_unique<B>());
lst.push_back(std::make_unique<B>());
for(auto &ptr : lst)
{
static_cast<B*>(ptr.get())->a = 5;
}
否则,在访问其字段之前使用 dynamic_cast
来测试派生的 class 类型:
struct A {};
struct B : A { int a; };
struct C : A { int b; };
std::list<std::unique_ptr<A>> lst;
lst.push_back(std::make_unique<B>());
lst.push_back(std::make_unique<C>());
for(auto &ptr : lst)
{
B *b = dynamic_cast<B*>(ptr.get());
if (b)
b->a = 5;
}