2013-10-17 215 views
-1

我:继承的对象

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

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

假设C是一个父类。有没有在主要方法任何方式使用方法addClassB类的一个对象,并D另一个类的对象,无论是从C类派生?当我这样做,想尽了办法getClass,我发现我不能够使用特定的属性,无论从类B或类D,只是属性从他们的父母,C类,因为如果他们被转换成它们的父类。我尝试过使用模板,但它似乎不起作用:。

编辑:只是完全没有这个问题,我不是故意要获得由C类A ...

+1

不要在文本中描述代码,请将其发布。 – Angew

+2

切片,或类似的东西? – John

+0

为什么要从'C'派生'A',在你的语境中对我来说没有意义。 –

回答

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的结果。

在你的示例代码,可以改为按引用传递参数(因为C是一个基类的Bint不是double一个基础,以便该选项不适用于我的代码)。也就是说给它类型C&而不是C。这意味着该函数不会获取副本,而是指您指定为参数的对象。

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

第二次看看你的代码:我想addClass将复制它的参数到名为map的容器中。同样,这是一个副本,因此容器中的值将是C类型的对象,而不是某种派生类型的对象。这可能需要使用shared_ptr<C>unique_ptr<C>代替C为价值型,并动态分配对象,而我又不能肯定地说。