指向派生类派生的向量的指针

时间:2017-06-25 19:21:18

标签: c++ class inheritance

我试图有一个指向不同类向量的指针向量,并且每个类都是从同一个基类派生的。

我的代码:

#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.

我不明白为什么,虽然我创建了BC个对象,但方法iAm()的调用会调用A's iAm()BC iAm()的来电必须调用BC的版本,因为构造函数为BC因为我只是将指针转换为向量,而不是向量中的元素。

我对此并不了解?

谢谢你。

2 个答案:

答案 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。”

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