指向包含基类和派生类对象的基类的指针向量-访问派生类特定变量 这段时间我一直在和C++的事情纠缠在一起。我已经创建了基本对象类和派生对象类,并试图在基类指针向量中存储对基本对象和派生对象的引用,以避免对象切片。 使用指针,我可以运行虚拟方法,并且可以确认指针指向派生类对象,但是我无法获得派生类特定的变量。有什么办法吗

指向包含基类和派生类对象的基类的指针向量-访问派生类特定变量 这段时间我一直在和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

基类对象:

派生类对象:

使用名为groupedEntities的管理器类和数组创建和存储这些基本na派生的对象:

我正在创建对象并尝试这样引用它们:

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;