Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

配列(vector)の継承について

Q&A

Closed

vector(配列)の継承について

c++で,配列またはvectorの継承について質問があります.
下のように親クラス・子クラスの2クラスを用意します.

class.h
class Parent
{
public:
  Parent(int number) : number(number){};
  ~Parent(){};

  int number;
};

class Child : public Parent
{
public:
  Child(int number) : Parent(number + 1){};
};

その後,下のように,親クラスを引数に持つtest関数に引き渡そうとするとエラーが起きます.

main.cpp
#include <iostream>
#include <vector>
#include "class.h"

void test(std::vector<Parent> &arr);

int main()
{
  std::vector<Child> arr;

  for (int i = 0; i < 10; i++)
  {
    auto d1 = Child(i);
    arr.push_back(d1);
  }

  test(arr);//エラー
}

void test(std::vector<Parent> &arr)
{
  for (const auto e : arr)
    std::cout << e.number << std::endl;
}

やりたいこととしては,子クラスのvector(配列)を関数testに引数で渡せるようにすることです.

テンプレートなどを使うべきなのでしょうか?
もしそれらを使う場合でも,こうしたほうが良いというアドバイス等ございましたら
ご教授いただけると幸いです.

0

2Answer

C++のエラーメッセージはえげつなくて読む気がしなくなりますが、何が起こったか見てもらうためにもエラーメッセージも提示するようにしましょう。
我々はエスパーではないので。

太古の昔の記憶なので勘違いしてるかもですが、C++のジェネリックコレクションはJavaとかと違って共変性がありません。所詮テンプレートだから。

たとえ要素に継承関係があっても、コレクションに入ってしまえば別クラス。
別クラスどおしだから参照渡しできない。

共変姓を持たせたければ、ポインタで保持する必要があったかと思います。

たぶん

int main() {
    std::vector<Parent*> arr;

    // (snip)
}

void test(std::vector<Parent*> &arr) {
    // (snip)
}
0Like

@ktz_alias さん

エラー文は下記の通りです.

ain.cpp: In function 'int main()':
main.cpp:17:8: error: invalid initialization of reference of type 'std::vector&' from expression of type 'std::vector'
17 | test(arr); //エラー
| ^~~
main.cpp:5:32: note: in passing argument 1 of 'void test(std::vector&)'
5 | void test(std::vector &arr);

やはり,arrの型の方をParentにしないと引渡しはできないのですね.
私用の問題でarrの型はChildで持ちたかったので,今回はテンプレートを使いたいと思います.
回答していただきありがとうございました.

main.cpp
#include <iostream>
#include <vector>
#include "class.h"

template <class D>
void test(std::vector<D> &arr);

int main()
{
  std::vector<Child> arr;

  for (int i = 0; i < 10; i++)
  {
    auto d1 = Child(i);
    arr.push_back(d1);
  }

  test(arr);
}

template <class D>
void test(std::vector<D> &arr)
{
  static_assert(std::is_base_of<Parent, D>::value == true, "D is not a derived class of Parent");

  for (const auto e : arr)
    std::cout << e.number << std::endl;
}
0Like

Your answer might help someone💌