class A{
public:
int var;
virtual int getVar() { return var; }
};
class B: public A{
public:
int anothervar;
int getAnotherVar() { return anothervar; }
};
class C: public A{
public:
int finalvar;
int getFinalVar() { return finalvar;}
};
int main () {
vector<A*> myvec;
myvec.push_back (new B()); // implying all constructors are ok
myvec.push_back (new C());
cout << myvec[0]->geVar(); // this works fine
cout << myvec[0]->getAnotherVar(); // how can I do this ?
cout << myvec[1]->getFinalVar(); // how can I do this ?
return 0;
}
这只是我试图解决的另一个问题的表示。所以我的问题是,如果可以从基类的指针向量调用派生类方法,因为我不能在基类中将它们声明为纯虚拟,因为我不想在两个派生中使用它们。
答案 0 :(得分:3)
您可以通过转换为正确的类型来执行此操作:
vector<A*>myvec; //pointer vector to base class
myvec.push_back(new B()); //implying all constructors are ok
myvec.push_back(new C());
cout << myvec[0]->geVar(); //this works fine
cout << myvec[1]->geVar(); //this works fine
B* b = dynamic_cast<B*>(myvec[0]);
assert(nullptr != b);
cout << b->getAnotherVar();
C* c = dynamic_cast<C*>(myvec[1]);
assert(nullptr != c);
cout << c->getFinalVar();
但是,需要以这种非统一的方式访问您的收藏可能会导致更大的课堂设计问题 更准确地说,这里看起来很精致和花花公子,因为你在访问它们的同一个地方创建了B和C类实例,所以哪个类的隐含信息在哪个索引是“本地”,但在一个现实的例子中,您可能会创建对象并在不同的位置访问它们,并且依赖于您想要的非统一访问的隐式索引信息可能会成为后来的错误来源。
答案 1 :(得分:0)
您只能调用该类型声明的方法。如果您有一个指向派生对象的基指针,并且想要调用只有派生类型声明的方法,则需要转换为该类型。
如果在编译时无法确定对象的类型是什么,则需要dynamic_cast执行运行时检查并在发生故障时抛出异常。
如果您可以在编译时保证类型,static_cast是合适的工具。
答案 2 :(得分:0)
你需要在这里进行投射。
cout<<static_cast<B*>(myvec[0])->getAnotherVar(); //how can i do this ?
cout<<static_cast<C*>(myvec[1])->getFinalVar(); //how can i do this ?