c++ - 继承问题中的模板

标签 c++ templates inheritance

我在 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>无论是什么类型,都永远不会“兼容”xy是。容器总是不同的类型。这是 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/

相关文章:

c++ - 动态创建 DateTimeAxis QML 图表 SplineSeries

c++ - 如何在 C++ 类中的 STL priority_queue 中实现这种比较

模板类中模板函数的显式特化的 C++ 语法?

javascript - ES6 JS 类中的属性继承

java - List<?> 是 List<Integer> 和 List<Number> 的共同父代吗?

c++ - Qt 多页 TIFF

c++ - Windows API 用于 C++ GUI 编程的优势

c++ - 标识符 "in"未定义

C++ 元编程 : A template parameter which *must* inherit an abstract class

java - hibernate 和继承(TABLE_PER_CLASS)