如何在c++中通过父类访问派生类的元素

how to access elements of a derived class through a parent class in c++?

本文关键字:派生 访问 元素 父类 c++      更新时间:2023-10-16
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/