c ++中继承的对象和属性的丢失

时间:2013-10-17 15:58:46

标签: c++ templates inheritance derived-class

我有:

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

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

假设C是父类。主方法中是否有任何方法可以将方法addClass与类B的对象和类D的另一个对象一起使用,它们都来自类C?当我这样做,并尝试方法getClass时,我注意到我将无法使用类B或类D中的特定属性,只能使用其父级,类中的属性C,好像他们被转换成了他们的父类。我尝试使用模板,但它似乎不起作用:。

编辑:这个问题完全失败了,我不是故意从C中派生出A级......

1 个答案:

答案 0 :(得分:2)

  

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

他们 转换为他们的父类。您的函数addClass按值C获取class的参数,但是如果您希望它编译,则需要另一个名称,因为class是一个C ++中的保留字不能用作参数的名称。

按值传递表示参数是您在参数表达式中指定的对象的副本。此副本的类型为C,但不了解BA

就像你写的那样:

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

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

在您的示例代码中,您可以通过引用传递参数(因为CB的基类:int不是double的基础所以该选项不适用于我的代码)。也就是说,给它类型C&而不是C。这意味着该函数不会复制,而是指您指定为参数的对象。

您仍然只能对属于C类接口一部分的该对象进行调用,但它至少会是BA的实例。不知道为什么要使用BA中的属性我无法判断这是否能解决您的问题,但这是一个开始。

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