C++ C++;-从向量到达派生类变量
我真的很困惑,所以我不得不问这个问题。我试图编写一个应用程序,但我不知道如何获取派生类的变量,这些变量位于基类的向量中。 代码是:C++ C++;-从向量到达派生类变量,c++,inheritance,vector,C++,Inheritance,Vector,我真的很困惑,所以我不得不问这个问题。我试图编写一个应用程序,但我不知道如何获取派生类的变量,这些变量位于基类的向量中。 代码是: class A { public: A() { }; std::vector<A> aVector; void Foo(); } class B : public A { public: B() { }; int j; } void A::Foo() { aVector.push_back( B(
class A {
public:
A() { };
std::vector<A> aVector;
void Foo();
}
class B : public A {
public:
B() { };
int j;
}
void A::Foo() {
aVector.push_back( B() );
// Here I would like to reach B::j, but only the members and variables of A comes in
aVector[0].j; // wrong
B b = aVector[0]; // no suitable user-defined conversion from "A" to "B" exists
// should I use cast? which one?
}
A类{
公众:
A(){};
向量向量向量机;
void Foo();
}
B类:公共A{
公众:
B(){};
int j;
}
void A::Foo(){
aVector.push_back(B());
//这里我想讨论B::j,但只有A的成员和变量进入
aVector[0].j;//错误
B=aVector[0];//不存在从“A”到“B”的合适的用户定义转换
//我应该使用cast吗?哪一个?
}
我目前正在通过应用程序编程学习继承和这类东西,现在我真的被卡住了
我寻找其他问题,但找不到任何解决我问题的方法。如果有,我错过了,那么很抱歉。这与向量无关。如果
B
源于A
,则以下代码:
A a;
B b = a;
是一个错误(除非有某种方法可以转换)
这是正确的-您应该能够统一处理向量项。如果这意味着使用向量的代码希望所有项目都是
B
,那么只需创建一个vector
。如果没有,那么您就没有必要将A
转换为B
。您需要将指针存储到A
,这样新的B
对象在推入向量时不会被“切片”(请参见说明)
另外,当您想要在基类的指针上使用特定的子方法/变量时,您需要将它转换为适当的类型
std::vector<A*> aVector;
aVector.push_back(new B());
B* b = (B*)aVector[0];
cout << b->j;
// remember to delete the content of aVector
std::vector了解有关强制转换(C样式
、dynamic\u cast
和static\u cast
)的更多信息,向量
声明为包含A
类型的对象,当您将B
推入向量时,所有B
-ness都从存储在向量中的对象中剥离。这就是我们所知道的
当您稍后尝试访问存储在向量中的对象的B
元素时,您无法访问,因为它们根本不存在。你没有B对象的向量
——你有a对象的向量
为了解决这个问题,您需要存储A
对象,而不是通过值,而是通过引用或指针。您不能将引用存储在向量中,因此这会给您留下指针。您不应该尝试从基类访问派生类成员。基类应该不知道派生类的实现细节。你所做的不是多态的。换句话说,您的B实例不能像A实例那样工作,因为您没有提供任何虚拟方法,也没有覆盖任何虚拟方法
整个设计和方法都是错误的。A::Foo()应该是一个虚拟方法(甚至可能是抽象方法)。您应该在B::Foo()中完成这项工作
还有一件事,你不应该只持有一个普通的旧a向量。它应该是指向a的指针。所以std::vector。该成员应以字母m作为前缀,以指示它是该类的成员变量。So std::向量mSomething 理想情况下,您应该存储指向A
的智能指针。想象一下,一个包含数百万个指针的裸向量突然出现异常:虽然我同意,但我认为我们正在远离最初的问题:)谢谢!我接受了这个,因为这给了我一个有效的解决方案。但现在我看到还有很多东西需要学习:)