我在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>
是什么类型,两种类型的x
和y
都是“不兼容的”。容器始终是不同的类型。这就是C ++中的规则。
在带有class B : A {};
的示例中,派生类从基类私有继承。因此,它们之间的联系甚至是一个秘密。
对于class B : public A {};
,情况有所不同,现在每个人都可以使用每个B
还包含一个A
部分的事实。
但这仍然不允许您彼此分配不同的向量类型,但可以单独分配每个元素。 B
对象也是A
。
vector类具有一个成员函数,因此您可以执行
a.assign(b.begin(), b.end());
这将复制每个
A
的B
部分,并将该副本存储在a
-vector中。它仍然会导致object slicing,并且不会将
vector<a>
转换为vector<b>
,但是会将每个B
的值(部分)分配给A
。当然,这种切片是否可接受取决于应用程序。