我在CPP和Java中都有一个问题。

#include <vector>

class A {};
class B : A {};

int main()
{
  std::vector<A> a;
 std::vector<B> b;

 a = b;  // compiler error
}


由于某些原因,这两个向量不兼容。



编辑细节



感谢所有的答案。我需要指出,上面的示例是问题的简化版本,不要与细节混淆。我真正的问题是一个Java项目,其中我使用包装器类来保持两个变量之间的引用连接。

Printable.java

package ConsoleGraphics;
public class Printable  { /** code */  }


StringPrintable.java

 package ConsoleGraphics;
 public class StringPrintable { /** code */}


Iterator.java

 package Jav.util;

 public abstract
 class Iterator<T> implements java.util.Iterator<T>
 {  /** code */  }


Copy_Iter.java

 package Jav.util;

 // An Iterator keeping deep copies of elements
 public class Copy_Iter<T> extends Iterator<T>
 {  /** code, defines abstract methods */ }


Ref_Iter.java

 package Jav.util;

 // Iterator keeping references of the elements.
 public class Ref_Iter<T> extends Iterator<T>
 { /** code, defines abstract methods */ }


Box.java

 package Jav.util;
 public class Box<T> extends Copy_Iter<T>
 { /** code */ }


RefBox.java

 package Jav.util;
 public class RefBox<T> extends Ref_Iter<T>
 {  /** code */ }


Screen.java

 package ConsoleGraphics;

 // This class creates my problem
 public class Screen
 {
   // data members
   private Jav.util.RefBox<Printable> p1;

   private Jav.util.RefBox<
                               Jav.util.Box <Printable> >p2;

    /** ctors and methods */


    // METHOD OF CONCERN
    // As you can see this function accepts a
    // Box containing Printable. If I try to feed it a
    // Box containing StringPrintable I fail. But if I
    // create a seperate method for StringPrintable
    // That would mean creating a separate method
    // for every class that inherits from Printable.
    //
    // The aim is for screen class to keep a
    // reference to the Box object added it. That
    // when that box increases or decreases,
   // Screen classes Box will do the same.
    // In CPP I wouldn't need the Box wrapper class
   // and would just use pointers to pointers.

    public void
    addPrintable(Jav.util.Box<Printable> p)
            {
     // pushBack was declared in Jav.util.Iterator
               p2.pushBack(p);
             }
  }


Main.java

 package main;   // easier to make jar file

 import ConsoleGraphics.*;
 import Jav.util.*;

 public class Main
 {

 public static void main(String[] args)
 {
   Box<StringPrintable> nums = new Box<>();

   Screen sodoku_game = new Screen();

    // error no matching function!
   sudoku_game.addPrintable(nums);
 }

 // Now imagine if someone inherits
 class TransformableChars extends Printable
 {
   /** extends code with techniques to make
        Printable Transformable */
 }

 }

最佳答案

不管vector<x>vector<y>是什么类型,两种类型的xy都是“不兼容的”。容器始终是不同的类型。这就是C ++中的规则。

在带有class B : A {};的示例中,派生类从基类私有继承。因此,它们之间的联系甚至是一个秘密。

对于class B : public A {};,情况有所不同,现在每个人都可以使用每个B还包含一个A部分的事实。

但这仍然不允许您彼此分配不同的向量类型,但可以单独分配每个元素。 B对象也是A

vector类具有一个成员函数,因此您可以执行

a.assign(b.begin(), b.end());


这将复制每个AB部分,并将该副本存储在a -vector中。

它仍然会导致object slicing,并且不会将vector<a>转换为vector<b>,但是会将每个B的值(部分)分配给A。当然,这种切片是否可接受取决于应用程序。

10-08 09:29
查看更多