我有一个派生自另一个的类,我使用一个基类指针数组来保存派生类的实例,但由于该数组属于基类,我无法使用指针访问属于派生类的成员我是否可以使用简单的命令访问这些成员,或者我应该只重写我的基类来定义成员并仅在派生类中使用它?
示例:
class A {
public:
int foo;
};
class B : public A {
public:
char bar;
};
class C : public A {
int tea;
};
int main() {
A * arr[5];
arr[0] = new B;
char test = arr[0]->bar; //visual studio highlights this with an error "class A has no member bar"
return 0;
}
答案 0 :(得分:6)
我无法使用指针表示法访问属于派生类的成员
这是设计的:您没有告诉编译器指针指向的对象是派生类型。
我是否可以通过简单的命令
访问这些成员
如果您在100%确定指针指向static_cast<B*>(arr[0])
时执行B
,则可以执行此操作,但应使用强制解决方案作为最后的手段。相反,您应该在基类中派生成员函数,并在派生类中提供实现:
class A {
public:
int foo;
virtual char get_bar() = 0;
};
class B : public A {
char bar;
public:
char get_bar() {
return bar;
}
};
答案 1 :(得分:0)
如果是您的代码,您的派生类成员是私有的。因此,您无法从基类访问它。 如果要访问,则必须将派生类的成员更改为&#34; public&#34;。 你应该修改你的代码:
class B : public A {
public:
char bar;
};
int main() {
A * arr[5];
arr[0] = new B;
char test = static_cast <B *>(arr[0])->bar; //visual studio highlights this with an error "class A has no member bar"
return 0;
}