我试图在另一个类中设置基类和派生类的数组.例如,我有基类:
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
但是当我尝试访问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,它也会进行检查,以确保你正在投射到正确的类型(研究这个).
或者,您可以简单地利用多态性(只有在您的特定情况下才有意义).