【问题标题】:inherited objects in c++ and loss of attributesc++中的继承对象和属性丢失
【发布时间】:2013-10-17 15:58:46
【问题描述】:

我有:

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...

【问题讨论】:

  • 不要用文字描述代码,贴出来。
  • 切片之类的?
  • 你为什么要从 C 派生 A,在你的上下文中对我来说没有意义。
  • 您可以添加指向 A 或 B 类的指针。您不能添加对象。你应该使用虚函数。另一个选项是从基类指针到其子类的 dynamic_cast,但它可能会失败

标签: c++ templates inheritance derived-class


【解决方案1】:

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

他们转换为他们的父类。您的函数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&amp; 而不是C。这意味着该函数不获取副本,而是引用您指定为参数的对象。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多