【问题标题】:How can I verify if I am working with a base or derived object in C++? [duplicate]如何验证我是在使用 C++ 中的基础对象还是派生对象? [复制]
【发布时间】:2018-08-18 09:06:03
【问题描述】:

假设我有一个类Product 和一个派生自Product 的类AuctionedProduct。然后我有一个虚函数foo,如果我正在使用Product 基类,它会执行'x',如果它实际上是AuctionedProduct,它会执行'y'。给定一个对象,我如何确定哪个类实际上是我正在处理的类?

【问题讨论】:

  • 如果你的设计是正确的,你不应该这样做。您调用适合该对象的函数,因为它已经从正确的类创建。
  • 请出示您的代码。通常,如果您需要知道多态对象的确切类型,那么您首先不需要多态
  • 请尝试创建Minimal, Complete, and Verifiable Example显示我们,而不是描述代码。
  • 你可以在这里找到你的答案:enter link description here
  • 您可以使用dynamic_cast,但使用dynamic_cast 是一种代码味道

标签: c++ class inheritance derived-class


【解决方案1】:

如果您正确使用继承,对基类 (Product) 的引用进行操作的代码不需要知道对象的实际类型,而是以相同的方式与每个产品交互。

但是,如果你真的想知道实际的类型,例如:因为调试的原因,你可以使用dynamic_cast:

void f(Product* p)
{
  AuctionedProduct* ap = dynamic_cast<AuctionedProduct*>(p);
  if (ap) {
    // we have an AuctionedProduct
  }
  else
  {
    // ap is nullptr, we have a different kind of product
  }
}

【讨论】:

    【解决方案2】:

    您可以使用虚方法,并为基类和派生类使用不同的实现,并使用该方法来识别对象类型。

    你可以在这里找到更多的描述:

    Check for derived type (C++)

    【讨论】:

      【解决方案3】:

      您好,您需要使用 dynamic_cast 来找出如下类型的对象,如果它与类类型参数匹配,dynamic_cast 方法将返回对象的地址。另请参阅以下代码中的我的 cmets:-

      class Product{};
      class AuctionedProduct : public Product{};
      class NonAuctionedProduct : public Product{};
      
      Product *prod1 = new AuctionedProduct();
      Product *prod2 = new NonAuctionedProduct();
      
      AuctionedProduct *ac = NULL;
      NonAuctionedProduct *nac = NULL;
      
      ac = dynamic_cast<AuctionedProduct*>(prod1);//here it will return the address as prod1 is a type AuctionedProduct
      if(ac != NULL )
      {
         //ac->dosomething
         cout<<"I am class AuctionedProduct<<endl;
      }
      nac = dynamic_cast<NonAuctionedProduct*>(*prod2);
      
      if(nac != NULL )
      {
         //nac->dosomething
         cout<<"I am class NonAuctionedProduct<<endl;
      }
      
      ac = dynamic_cast<AuctionedProduct*>(prod2); //here it will return NULL as prod2 is a object of type NonAuctionedProduct
      

      【讨论】:

        猜你喜欢
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-23
        • 2020-10-11
        • 2013-08-11
        • 2017-02-26
        相关资源
        最近更新 更多