我试图有一个指向不同类向量的指针向量,并且每个类都是从同一个基类派生的。
我的代码:
#include <iostream>
#include <vector>
#include <stdlib.h>
class A
{
public:
A() { std::cout << "A constructor.\n"; }
virtual ~A() { std::cout << "A destructor\n"; }
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.
我不明白为什么,虽然我创建了B
和C
个对象,但方法iAm()
的调用会调用A's
iAm()
。 B
和C
iAm()
的来电必须调用B
和C
的版本,因为构造函数为B
和C
因为我只是将指针转换为向量,而不是向量中的元素。
我对此并不了解?
谢谢你。
答案 0 :(得分:3)
您的错误在于您认为std::vector<B>
与std::vector<A>
兼容,因为B来自A。事实并非如此。 A和B之间的继承关系不会转换为std::vector<A>
和std::vector<B>
之间的继承关系。你必须使用C风格的强制转换来消除编译器的错误消息,但这并不能解决问题。
答案 1 :(得分:0)
您可能想看看这个问题: Vector that can have 3 different data types 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。”
另外,请考虑使用智能指针。