-1

我有 :

class A
{
public:
    A();
    ~A();
    void addClass(int id, C class);
    C getClass(int id);

private:
    hash_map<int, C> map; //TEMPLATE
};

假设C是一个父类。在 main 方法中有什么方法可以将该方法addClass与一个类对象B和另一个类对象一起使用D,这两个对象都派生自 class C?当我这样做并尝试该方法getClass时,我注意到我将无法使用 classB或 class的特定属性D,只能使用它们的父类 class 的属性C,就好像它们已转换为它们的父类一样。我尝试使用模板,但它似乎不起作用:.

编辑:这个问题完全失败了,我并不是要从 C 派生类 A ......

4

1 回答 1

2

好像他们被转换成他们的父类

它们转换为它们的父类。您的函数addClass采用按值类型C的参数(您已调用class,但如果您希望它编译您需要另一个名称,因为classC++ 中的保留字不能用作参数的名称)。

按值传递意味着参数是您在参数表达式中指定的对象的副本。这个副本有 type C,它不知道Band A

就像你写的一样:

void func(int a) { std::cout << a << '\n';}
...
func(1.5);

这会打印1,而不是1.5,因为参数a是将值转换1.5为类型的结果int

在您的示例代码中,您可以改为通过引用传递参数(因为:C的基类不是基类,因此该选项不适用于我的代码)。也就是说给它 type而不是. 这意味着该函数不获取副本,而是引用您指定为参数的对象。BintdoubleC&C

您仍然只能对属于 class 接口的该对象进行调用C,但它至少是Bor的一个实例A。在不知道您为什么要使用属性的情况下,B或者A我不知道这是否会解决您的问题,但这是一个开始。

再次查看您的代码:我想addClass将其参数复制到名为map. 同样,这是一个副本,因此容器中的值将是 type 的对象C,而不是某些派生类型。可能需要使用shared_ptr<C>orunique_ptr<C>而不是C作为值类型,并动态分配对象,但我不能肯定地说。

于 2013-10-17T16:06:44.100 回答