如何实例化派生类的数组

时间:2012-10-23 20:51:12

标签: c++

我正在尝试在另一个类中设置基类和派生类的数组。例如,我有基类:

class Base{
public:
    Base() {};
    Base(float kv) : param(kv) {}
    ~Base() {};
    float getParam() { return param; }
    void setParam(bool kv) { param= kv; }
protected:
    float param;
};

和派生类如:

class Derived1: public Base{
public:
    Derived1() {};
    Derived1(float kv) : Base(kv) {}
    ~Derived1() {};
};

现在,在另一个类中,我有一个Base类型的数组。

class Hive{
public:
    Hive() {};
    Hive(...) : ... {}
    ~Hive() {};
    ...
    float getSomethingFromArray();

    ...
    void setB();
protected:
    ...
    Base *b[7];
};

现在,setB()实例化数组,如:

b[0] = new Derived1();

但是当我尝试访问b [0]的方法时,它将不起作用。 当我称之为方法时:

b[0].setParam(i);

编译器报告此错误

  

IntelliSense:表达式必须具有类   键入c:\ users \ miller \ documents \ visual studio   2010 \ projects \ hello \ hello \ objekat.h 139 2你好

2 个答案:

答案 0 :(得分:5)

  

但是当我尝试访问b [0]的方法时,它将不起作用。有什么想法吗?

b[0]Base*。编译器不知道它指向的对象的实际类型是BaseDerived1还是Derived42,这就是为什么它只允许你从Base调用方法的原因在它上面 - 因为它是唯一可以保证存在的。

我猜你正在尝试从Derived1调用方法:

b[0] = new Derived1();
//...
b[0]->getSomethingFromArray();

但请注意,您的代码很容易被替换为:

b[0] = new Base();
//...
b[0]->getSomethingFromArray();
现在怎么样?要使其正常工作,您可以使用强制转换并将b[0]强制转换为您需要的类型(前提是您已确定)。如果你的类是多态的,你可以使用dynamic_cast,它也会进行检查,以确保你投射到正确的类型(研究这个)。

或者,您可以简单地利用多态性(只有在您的特定情况下才有意义)。

答案 1 :(得分:1)

你的错误非常简单,要通过指针调用方法,你必须使用->运算符 - 而不是点.

不是这样的:

b[0].setParam(i);

但是这样:

b[0]->setParam(i);