class game_list
{
public:
string name;
float price;
string platform;
string console;
string conditin;
bool is_portable;
};
class catridgeClass:public game_list
{
string N_bits;
bool is_import;
};
动态创建游戏列表,名为mainPointer
的指针指向该动态对象。但我对如何通过父类cartridgeClass
访问game_list
个元素感到困惑。我已经尝试mainPointer->N_bits
了。好像它不会这样工作?对不起,我只是c ++的菜鸟。
答案 0 :(得分:2)
要访问catridgeClass属性,您需要一个catridgeClass对象。
首先,您需要更正您的班级以获得公共属性。
class catridgeClass:public game_list
{
public:
string N_bits;
bool is_import;
};
class anotherClass: public game_list
{
public:
string other_member;
};
您需要从调用函数中获取catridgeClass对象:
int main()
{
std::vector<game_list *> games;
games.push_back(new catridgeClass);
games.push_back(new anotherClass);
for(int i=0; i<games.size(); i++)
{
//You will need to get a catridgeClass object to access it's members.
catridgeClass *catridge_ptr = dynamic_cast<catridgeClass *>(games[i]);
//Or to access anotherClass.
anotherClass *another_ptr = dynamic_cast<anotherClass*>(games[i]);
//If the conversion is not possible, dynamic_cast will return a null pointer
if(catridgeClass != NULL)
std::cout << catridge->N_bits << std::endln;
if(anotherClass != NULL)
std::cout << anotherClass->other_member << std::endln;
}
//And of course, you need to avoid a memory leak
for(int i=0; i<games.size(); i++)
delete games[i]
return 0;
}
请记住,这不是理想的设计。如果你试图使用polimorphism,那是因为所有类都有共同的行为。更好的方法是使用interfaces。
答案 1 :(得分:1)
在父类中尝试虚拟方法getNBits() = 0;
,并在子类中定义它。
答案 2 :(得分:1)
父类没有关于其子类的信息。做你想做的事的唯一方法就是像Dory建议的那样 - 我经常皱眉 - 或者在子类重新定义的父类中创建一个虚函数。
为什么我对演员皱眉?大多数情况下,动态转换对象以从中获取数据代表了编写糟糕的代码。我不确定代码的其余部分是什么样的,但我的猜测是有更好的方法通过共享功能来编写代码。例如,假设您要使用这些项目的是显示字符串信息。在这种情况下,编写它的最佳方法是使用虚函数:
class game_list
{
public:
string name;
float price;
string platform;
string console;
string conditin;
bool is_portable;
public virtual void PrintInfo()
{
cout << "name: " << name << ", price: " << price; //etc
}
};
class catridgeClass:public game_list
{
string N_bits;
bool is_import;
public virtual void PrintInfo()
{
game_list::PrintInfo();
cout << ", bits: " << bits << ", is import: " << is_import;
}
};
现在调用mainPointer-&gt; PrintInfo()将打印正确的信息,无论其基础类型如何。更好,这是“面向对象的方式。”
答案 3 :(得分:0)
尝试使用dynamic_cast
catridgeClassPtr = dynamic_cast<catridgeClass*>(GameListPtr);
catridgeClassPtr->N_bits;
有关dynamic_cast的完整信息: http://www.cplusplus.com/doc/tutorial/typecasting/