如何引用基类的派生类?

时间:2018-10-31 18:31:05

标签: c++ stl static-cast

1st column

上面是原始代码。有人告诉我不要更改上面的代码。现在我有

mr

现在我有set.seed(1234) j = 1 i = 1 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] 2.792934 6.277429 7.084441 i = 2 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] -0.3456977 2.4291247 4.5060559 i = 3 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] 2.425260 2.453368 2.435548 set.seed(1234) j = 2 i = 1 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] 3.792934 2.277429 3.084441 i = 2 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] 3.654302 6.429125 8.506056 i = 3 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] 7.425260 7.453368 7.435548 set.seed(1234) j = 3 i = 1 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] -0.2070657 6.2774292 7.0844412 i = 2 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] 1.654302 4.429125 9.506056 i = 3 c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1)) [1] 2.425260 2.453368 2.435548 。但是r没有成员class Element { }; class Container { vector<Element*> elements; }; 。有什么简单的方法可以将class IndexElement: public Element { int b_index; }; class Container* ctr; 的属性从ctr->elements重定向到Element?预先感谢!

2 个答案:

答案 0 :(得分:0)

您有一个选择:知道您在向量中拥有IndexElement而不是Element,然后可以使用static_cast<IndexElement*>(elements[i]);。请注意,如果您没有IndexElement,那么这将彻底中断。

如果可以修改b,则可以通过将b设置为虚拟来选择另一种选择。如果您不知道,则可能有ElementIndexElement,在这种情况下,请使用dynamic_cast<IndexElement*>(elements[i]);并测试其结果是否为nullptr。在这种情况下,b 必须是虚拟的(因此是虚拟析构函数)。

(我假设我们在Container中,所以直接访问其成员)

使用修改后的Elements进行的全面试用(由于未分配elements,因此将失败:

#include <vector>

using namespace std;

class Element{
public:
    virtual ~Element() {}
};

class Container{
    public:
vector<Elements*>elements;
};

class IndexElement: public Element{
int index;
};

int main()
{
    Container aa;
    static_cast<IndexElement*>(aa.elements[0]);
    dynamic_cast<IndexElement*>(aa.elements[0]);
    return 0;
}

答案 1 :(得分:0)

好吧,即使没有虚拟和RTTI(动态投放),您仍然可以选择跟踪并检查创建的suffix实例,例如:

IndexElement

因此,您基本上可以保留所有已创建实例的地址集,并且在检查特定实例时,只需检查当前对象地址是否在该地址集中。

std::unordered_set<Element *> idxElemSet; class IndexElement: public Element { int b_index; public: IndexElement(int index) : b_index(index) { idxElemSet.insert(this); } IndexElement(const IndexElement& other) : b_index(other.b_index) { idxElemSet.insert(this); } // might also need the move constructor in case of c++11 ~IndexElement() { idxElemSet.erase(this); } }; int main() { Container c; ... Element* e = c.elements[0]; if (idxElemSet.find(e) != idxElemSet.end()) { IndexElement* ie = static_cast<IndexElement*>(e); // do something with ie->b_index } return 0; } idxElemSet内部也可以是静态的,并且类本身可能仅提供静态转换功能,该功能在内部进行检查和转换,等等。