指向派生类的向量的指针

Pointers to vectors of derived a derived class

本文关键字:向量 指针 派生      更新时间:2023-10-16

我正在尝试有一个指向不同类向量的指针向量,并且每个类都派生自相同的基类。

我的代码:

#include <iostream> 
#include <vector> 
#include <stdlib.h> 
class A 
{ 
public: 
A() { std::cout << "A constructor.n"; } 
virtual ~A() { std::cout << "A destructorn"; } 
virtual void iAm() { std::cout << "I am A.n"; } 
}; 
class B : public A 
{ 
public: 
B() { std::cout << "B constructor.n"; } 
~B() { std::cout << "B destructor.n"; } 
virtual void iAm() { std::cout << "I am B.n"; } 
private:
std::string s;
}; 
class C : public A 
{ 
public: 
C() { std::cout << "C constructor.n"; } 
~C() { std::cout << "C destructor.n"; } 
virtual void iAm() { std::cout << "I am C.n"; } 
private:
std::string s;
int n;
}; 
int main() 
{
std::vector<std::vector<A>*> vect;
vect.resize(3);
vect[0]=new std::vector<A>;
vect[1]=(std::vector<A>*) new std::vector<B>;
vect[2]=(std::vector<A>*) new std::vector<C>;
vect[0]->push_back(A());
vect[0]->push_back(A());
vect[1]->push_back(B(methods are A methods));
vect[1]->push_back(B());
vect[2]->push_back(C());
vect[2]->push_back(C());
(*vect[0])[0].iAm();
(*vect[0])[1].iAm();
(*vect[1])[0].iAm();
(*vect[1])[1].iAm();
(*vect[2])[0].iAm();
(*vect[2])[1].iAm();
}

但是执行给了我:

A constructor.
A destructor.
A constructor.
A destructor.
A destructor.
A constructor.
B constructor.
B destructor.
A destructor.
A constructor.
B constructor.
A destructor.
B destructor.
A destructor.
A constructor.
C constructor.
C destructor.
A destructor.
A constructor.
C constructor.
A destructor.
C destructor.
A destructor.
I am A.
I am A.
I am A.
I am A.
I am A.
I am A.

我不明白为什么,虽然我创建了BC对象,但该方法的调用iAm()调用A'siAm()BCiAm()的调用必须调用BC的版本,因为构造函数是BC的,并且因为我只是将指针投射到向量,而不是向量中的元素。

我对此有什么不明白的?

谢谢。

你的错误在于你假设std::vector<B>std::vector<A>兼容,因为 B 是从 A 派生出来的。事实并非如此。A 和 B 之间的继承关系不会转换为std::vector<A>std::vector<B>之间的继承关系。您必须使用 C 样式强制转换来使编译器的错误消息静音,但这并不能解决问题。

你可能想看看这个问题: 可以具有 3 种不同数据类型的向量C++

下面是代码如何工作的示例:

std::vector<std::vector<A*>*> vect;
//you can also do vect.resize(3) and then write something like vect[0] = new std::vector<A*>;
vect.push_back(new std::vector<A*>);
vect[0]->push_back(new A());
vect.push_back(new vector<A*>);
vect[1]->push_back(new B());
(*vect[0])[0]->iAm();
(*vect[1])[0]->iAm();

这将打印:

构造函数。

构造函数。

B 构造函数。

"我是A。">

"我是B。">

此外,请考虑使用智能指针。