如何实例化派生类的数组

mil*_*ler 1 c++

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

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

和派生类如:

class Derived1: public Base{
public:
    Derived1() {};
    Derived1(float kv) : Base(kv) {}
    ~Derived1() {};
};
Run Code Online (Sandbox Code Playgroud)

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

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

    ...
    void setB();
protected:
    ...
    Base *b[7];
};
Run Code Online (Sandbox Code Playgroud)

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

b[0] = new Derived1();
Run Code Online (Sandbox Code Playgroud)

但是当我尝试访问b [0]的方法时,它将无法工作.当我称之为方法时:

b[0].setParam(i);
Run Code Online (Sandbox Code Playgroud)

编译器报告此错误

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

Luc*_*ore 5

但是当我尝试访问b [0]的方法时,它将无法工作.有什么想法吗?

b[0]是一个Base*.编译器不知道它指向的对象的实际类型是Base,Derived1或者Derived42,这就是为什么它只允许你从中调用方法Base- 因为它们是唯一可以保证存在的方法.

我猜你正试图从Derived1上面调用方法:

b[0] = new Derived1();
//...
b[0]->getSomethingFromArray();
Run Code Online (Sandbox Code Playgroud)

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

b[0] = new Base();
//...
b[0]->getSomethingFromArray();
Run Code Online (Sandbox Code Playgroud)

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

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