我有:
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级......
答案 0 :(得分:2)
好像他们被转换为他们的父类
他们 转换为他们的父类。您的函数addClass
按值C
获取class
的参数,但是如果您希望它编译,则需要另一个名称,因为class
是一个C ++中的保留字不能用作参数的名称。
按值传递表示参数是您在参数表达式中指定的对象的副本。此副本的类型为C
,但不了解B
和A
。
就像你写的那样:
void func(int a) { std::cout << a << '\n';}
...
func(1.5);
这会打印1
,而不是1.5
,因为参数a
是将值1.5
转换为int
类型的结果。
在您的示例代码中,您可以通过引用传递参数(因为C
是B
的基类:int
不是double
的基础所以该选项不适用于我的代码)。也就是说,给它类型C&
而不是C
。这意味着该函数不会复制,而是指您指定为参数的对象。
您仍然只能对属于C
类接口一部分的该对象进行调用,但它至少会是B
或A
的实例。不知道为什么要使用B
或A
中的属性我无法判断这是否能解决您的问题,但这是一个开始。
再次查看代码:我想addClass
将其参数复制到名为map
的容器中。同样,这是一个副本,因此容器中的值将是C
类型的对象,而不是某些派生类型的对象。可能需要使用shared_ptr<C>
或unique_ptr<C>
而不是C
作为值类型,并动态分配对象,但我无法肯定地说。