2

我处于C ++的初学者阶段。假设我有一个基类和一个派生类:

class Base{
 ....

}

class Derived:public Base{

 ....
}

现在我有如下两个向量,我将执行一些操作来创建基础对象和派生对象,并将这些对象分别推回它们对应的向量:

std::vector<Base*> baseVector
std::vector<Derived*> derivedVector

我想将derivedVector 的每个元素(对象)指向baseVector 的每个元素(对象)。假设 derivedVector[2] 将有一个指向 baseVector[2] 的指针,这样我就可以随时从派生对象访问基础对象。我该怎么做?

4

4 回答 4

3

你的意思不是很清楚,但如果我理解正确,你想把指向你的Derived对象的指针放在两个向量中。您可以通过以下方式实现:

baseVector[2] = derivedVector[2] = new Derived();
于 2013-11-14T18:14:25.053 回答
0

看看你是否想使用基列表来包含派生对象指针,那么就可以了。但是您不能使用派生列表来保存基指针。

可能是你想要的东西。

Base * pBase = new Base();
Derived *pDerived_1 = new Derived();
// or
Base *pDerived_2 = (Base *)new Derived();
// this can be anytime casted back
Derived *pDerived_3 = (Derived*)pDerived_2;

// you can also push them into base vector
lstBasePtr.push_back(pBase);
lstBasePtr.push_back(pDerived_1);
lstBasePtr.push_back(pDerived_2);
lstBasePtr.push_back(pDerived_3);
于 2013-11-14T18:28:54.807 回答
0

我认为这是您问题的重要部分:

...这样我就可以随时从派生对象访问基础对象。

答案相当简单。通过继承,派生对象已经可以访问其基础对象。 这就是继承的全部意义。

你可以保持简单:

class Base{
    SomeBaseFunction();
}

class Derived : public Base{
    // Do not add a Base* here.
}

int main() {
    Derived *derived_object = new Derived();
    derived_object->SomeFunction();  // this works.
}

您应该在这里更清楚地考虑您vector的 s。您可能只需要一个向量,而不是两个。此外,您可能应该处理vector<Derived>,而不是vector<Derived*>

int main () {
    Derived derived_object;   // don't use `new` here, it's just awkward

    vector<Derived>  vector_of_objects;
    vector_of_objects.push_back(derived_object);
}

在现代 C++ 中,无论您是初学者还是专家,都不应该使用*new经常使用。

于 2013-11-19T23:17:01.037 回答
-1

您好,感谢您的回复。我已经弄清楚我需要做什么。不确定它是否是最聪明的方法,如果不是,请建议我。

这是我的做法:

class Base{
    SomeBaseFunction();

}

class Derived:public base{
//I have put a pointer of base type here 
base *basePointer;
}

现在在我基本上填充基向量和派生向量的主函数中,我执行以下操作:

derivedObject->basePointer = baseObject;

现在我可以按如下方式访问基本属性:

derivedObject->basePointer->SomeBaseFunction();
于 2013-11-19T23:04:01.583 回答