【发布时间】:2017-06-25 19:21:18
【问题描述】:
我正在尝试拥有一个指向不同类向量的指针向量,其中每个类都派生自同一个基类。
我的代码:
#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 并且因为我只是将指针转换为向量,而不是向量。
对此我有什么不明白的地方?
谢谢你。
【问题讨论】:
-
应用 c 样式转换
= (std::vector<A>*) new std::vector<B>;会中断类型检查。由于某种原因,您不能将std::vector<B> *分配给std::vector<A> *。 -
这有点令人费解:
(std::vector<A>*) new std::vector<B>;你告诉编译器假装指向一种类型的指针是指向不相关类型的指针。我看不出你怎么能期望得到理智的结果。老实说,你怎么知道会产生什么结果?
标签: c++ class inheritance