我在 CPP 和 Java 中都遇到了问题。
#include <vector>
class A {};
class B : A {};
int main()
{
std::vector<A> a;
std::vector<B> b;
a = b; // compiler error
}
出于某种原因,这两个 vector 不兼容;
编辑细节
谢谢大家的回答。我需要指出,上面的示例是问题的简化版本,以免与细节混淆。我真正的问题是一个 Java 项目,我在其中使用包装类来保持两个变量之间的引用连接。
Printable.java
package ConsoleGraphics;
public class Printable { /** code */ }
StringPrintable.java
package ConsoleGraphics;
public class StringPrintable { /** code */}
迭代器.java
package Jav.util;
public abstract
class Iterator<T> implements java.util.Iterator<T>
{ /** code */ }
复制_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 */ }
盒子.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 */ }
屏幕.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);
}
}
主.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 {};
派生类从基类私下继承。所以他们之间的关系甚至是个 secret 。
这对于 class B : public A {};
是不同的,现在每个人都可以使用每个 B
的事实还包含一个 A
-部分。
这仍然不允许您将不同的 vector 类型分配给彼此,但它确实允许单独分配每个元素。 B
-object 也是一个 A
.
vector 类有一个成员函数,所以你可以这样做
a.assign(b.begin(), b.end());
这复制了 A
-每个B
的一部分并将拷贝存储在 a
中- vector 。
它仍然会导致 object slicing并且不转 vector<a>
进入 vector<b>
, 但它确实分配了每个 B
的(部分)值到A
.这种切片是否可以接受当然取决于应用程序。
关于c++ - 继承问题中的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51335170/