1

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

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 hello

4

2 回答 2

5

但是当我尝试访问 b[0] 的方法时它不起作用。任何想法为什么?

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

我猜你正试图从中调用方法Derived1

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

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

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

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

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

于 2012-10-23T21:04:16.617 回答
1

您的错误很简单,要通过指针调用方法,您必须使用->operator - 而不是 dot .

不是这样:

b[0].setParam(i);

但是通过这种方式:

b[0]->setParam(i);
于 2012-10-23T21:14:18.043 回答