指向包含基类和派生类对象的基类的指针向量-访问派生类特定变量 这段时间我一直在和C++的事情纠缠在一起。我已经创建了基本对象类和派生对象类,并试图在基类指针向量中存储对基本对象和派生对象的引用,以避免对象切片。 使用指针,我可以运行虚拟方法,并且可以确认指针指向派生类对象,但是我无法获得派生类特定的变量。有什么办法吗
基类对象: 派生类对象: 使用名为groupedEntities的管理器类和数组创建和存储这些基本na派生的对象: 我正在创建对象并尝试这样引用它们:指向包含基类和派生类对象的基类的指针向量-访问派生类特定变量 这段时间我一直在和C++的事情纠缠在一起。我已经创建了基本对象类和派生对象类,并试图在基类指针向量中存储对基本对象和派生对象的引用,以避免对象切片。 使用指针,我可以运行虚拟方法,并且可以确认指针指向派生类对象,但是我无法获得派生类特定的变量。有什么办法吗,c++,object,pointers,vector,polymorphism,C++,Object,Pointers,Vector,Polymorphism,基类对象: 派生类对象: 使用名为groupedEntities的管理器类和数组创建和存储这些基本na派生的对象: 我正在创建对象并尝试这样引用它们: void main() { std:size_t groupBlob = 0u; Manager* manager = new Manager(); Derived* blob1(manager->addEnt<Derived>()); Derived* blob2(manager->a
void main() {
std:size_t groupBlob = 0u;
Manager* manager = new Manager();
Derived* blob1(manager->addEnt<Derived>());
Derived* blob2(manager->addEnt<Derived>());
manager->addToGroup(blob1, groupBlob);
manager->addToGroup(blob2, groupBlob);
auto& grouped(manager->getGroup(groupBlob));
for (auto& e : grouped)
{
e->speak();
std::cout << e.DerviedVariable ;
}
}
不幸的是,e.DerviedVariable是不可访问的,而speak函数表示Dervied类正在说话。是否有任何方法可以使用此体系结构访问派生类变量?谢谢您可以在这种情况下使用。表达式dynamic_caste,其中e的类型为Base*,如果e实际上指向派生类型的对象,则将计算为派生*,否则将计算为空指针
if(Derived* d = dynamic_cast<Derived*>(e)) {
std::cout << d->e.DerviedVariable;
}
是的,这是可能的。您只需要转换指针。最简单的语法是: 派生*e->DerviedVariable 这相当于模丢弃常数,如果有C++ish的话 静态种姓->德维德变量 这里的“static”一词提醒您没有运行时检查:编译器相信e确实指向派生的实例。否则,将发生未定义的行为。更安全的选择是动态投影: 如果对象不是派生的实例,则返回NULL。请注意,引用也可以强制转换,但由于没有空引用,如果强制转换不可能,则将转而抛出dynamic_cast
然而,出于某种原因,使用这种类型转换通常被认为是一种不好的做法。虚拟函数更可取,主要是因为使用它们甚至不需要知道调用点的实际对象类型。Unrelated:main必须声明为返回int。添加纯虚拟函数Virtual int getDerviedVariable=0;如果您认为需要从基类指针获取派生类特定变量,那么您的设计几乎肯定需要进行工作。通常,基类应该为作业提供虚拟函数,或者指针应该指向派生类,而不是基类。考虑到你的类应该代表什么,什么才有意义。
constexpr std::size_t maxGroups = 32;
using Group = std::size_t;
class Manager
{
public:
std::array<std::vector<Base*>, maxGroups> groupedEntities;
void addToGroup(Base* mBase, Group mGroup)
{
groupedEntities[mGroup].emplace_back(mBase);
}
std::vector<Base*>& getGroup(Group mGroup)
{
return groupedEntities[mGroup];
}
template <typename T, typename... TArgs>
T* addEnt(TArgs&&... mArgs)
{
T* e(new T(this));
return e;
}
};
void main() {
std:size_t groupBlob = 0u;
Manager* manager = new Manager();
Derived* blob1(manager->addEnt<Derived>());
Derived* blob2(manager->addEnt<Derived>());
manager->addToGroup(blob1, groupBlob);
manager->addToGroup(blob2, groupBlob);
auto& grouped(manager->getGroup(groupBlob));
for (auto& e : grouped)
{
e->speak();
std::cout << e.DerviedVariable ;
}
}
if(Derived* d = dynamic_cast<Derived*>(e)) {
std::cout << d->e.DerviedVariable;
}
Derived *ee = dynamic_cast<Derived*>(e);
if (ee)
x = ee->DerviedVariable;