gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:31:33 28 4
gpt4 key购买 nike

我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com