我正处于C++的初学者阶段。假设我有一个基类和一个派生类:
class Base{
....
}
class Derived:public Base{
....
}
现在我有两个向量如下,我将对一些创建基对象和派生对象执行一些操作,并将这些对象分别推回相应的向量:
std::vector<Base*> baseVector
std::vector<Derived*> derivedVector
我想将 derivedVector 的每个元素(对象)指向 baseVector 的每个元素(对象)。假设 derivedVector[2] 将有一个指向 baseVector[2] 的指针,以便我可以随时从派生对象访问基本对象。我应该怎么做?
你的意思不是很清楚,但是如果我理解正确,你想在两个向量中放置指向Derived
对象的指针。您可以通过以下方式实现它:
baseVector[2] = derivedVector[2] = new Derived();
我认为这是您问题的重要部分:
。这样我可以随时从派生对象访问基对象。
答案相当简单。 通过继承,派生对象已经可以访问其基对象。 这就是继承的全部意义。
您可以保持简单:
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
在这里。 您可能只需要一个向量,而不是两个。 另外,您可能应该处理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
。
看看如果你想使用基列表来包含派生的对象指针,那么没关系。 但不能使用派生列表来保存基指针。
也许你想要类似的东西。
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);
感谢您的回复。我已经弄清楚我需要做什么。不确定这是否是最聪明的方式,如果不是,请建议我。
这是我是如何做到的:
class Base{
SomeBaseFunction();
}
class Derived:public base{
//I have put a pointer of base type here
base *basePointer;
}
现在,在我基本上填充基向量和派生向量的主函数中,我执行以下操作:
derivedObject->basePointer = baseObject;
现在我可以按如下方式访问基本属性:
derivedObject->basePointer->SomeBaseFunction();