如何在c++中通过父类访问派生类的元素
how to access elements of a derived class through a parent class in c++?
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
的指针指向该动态对象。但我对如何通过父类game_list
访问cartridgeClass
s元素感到困惑。我已经试过mainPointer->N_bits
了。好像不是这样的?
要访问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;
}
请记住,这不是理想的设计。如果您尝试使用多态,那是因为所有的类共享共同的行为。更好的方法是使用接口。
尝试在父类中创建一个虚拟方法getNBits() = 0;
,并在子类中定义它。
参见:c++ Virtual/Pure Virtual Explained
父类没有关于其子类的信息。唯一的方法就是像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->PrintInfo()将打印正确的信息,而不管其底层类型是什么。好多了,它是"面向对象的方式"。
尝试使用dynamic_cast
catridgeClassPtr = dynamic_cast<catridgeClass*>(GameListPtr);
catridgeClassPtr->N_bits;
dynamic_cast的全部信息:http://www.cplusplus.com/doc/tutorial/typecasting/
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 为什么此派生对象无法访问基类的后递减方法?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- 按基类对象访问派生类资源时出错
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 从模板化父类中的派生内部类访问受保护的成员变量
- 如何从派生类访问基类中的重载运算符?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- C++11: 如何访问派生类中的基类成员?
- 访问派生类的 QMetaObject
- 使用基类对象访问派生的仅类方法
- 如何在 c++ 中通过基类引用访问派生类的对象?
- 派生类无法访问基类的受保护成员
- 如何在 c++ 中使用多态性访问派生类字段?
- 为了访问方法,从基类动态转换为派生类
- C++继承从基类指针访问派生类中的非虚拟函数