【问题标题】:Pointers to vectors of derived a derived class指向派生类的向量的指针
【发布时间】: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.

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

对此我有什么不明白的地方?

谢谢你。

【问题讨论】:

  • 应用 c 样式转换 = (std::vector&lt;A&gt;*) new std::vector&lt;B&gt;; 会中断类型检查。由于某种原因,您不能将 std::vector&lt;B&gt; * 分配给 std::vector&lt;A&gt; *
  • 这有点令人费解:(std::vector&lt;A&gt;*) new std::vector&lt;B&gt;; 你告诉编译器假装指向一种类型的指针是指向不相关类型的指针。我看不出你怎么能期望得到理智的结果。老实说,你怎么知道会产生什么结果?

标签: c++ class inheritance


【解决方案1】:

您的错误是您假设std::vector&lt;B&gt;std::vector&lt;A&gt; 兼容,因为B 派生自A。事实并非如此。 A 和 B 之间的继承关系不会转换为 std::vector&lt;A&gt;std::vector&lt;B&gt; 之间的继承关系。您必须使用 C 风格的强制转换来消除编译器的错误消息,但这并不能解决问题。

【讨论】:

    【解决方案2】:

    你可能想看看这个问题: 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。”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-19
      • 2021-05-20
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多