【问题标题】:C++ polymorphismC++ 多态性
【发布时间】:2011-12-15 05:13:09
【问题描述】:

我遇到了一个奇怪的问题,我相信这很容易解决。我有一个超级类,我们称之为“鸟”。 Bird 有一个名为 chirp 的虚函数,它返回 0。我还有一个子类,让我们称之为...SomeOtherBird。 SomeOtherBird 是 Bird 的子类。我的子类的 chirp() 函数应该返回 1。

到目前为止:

Bird.Chirp() 应该返回 0 SomeOtherBird.Chirp() 应该返回 1

其他鸟类是鸟类的子类。

现在假设我将 Bird 传入一个单独的构造函数,我们称它为 nest。

所以:巢(鸟& x)

如果我传入 SomeOtherBird,然后调用 Chirp,它会调用主超类的虚函数,而不是子类的虚函数,例如:

SomeOtherBird x; 巢(x); 然后如果我执行 x.chirp,则调用 main 方法,而不是子类的方法。

如何获取要调用的子类中的函数,而不是虚拟主函数?

谢谢

【问题讨论】:

  • 另外,包括您遇到问题的实际代码,而不是一些迂回的描述。
  • Dynamic Dispatch 应该可以工作并且应该返回 1,除非你正在做其他事情。发布您的整个代码

标签: c++ inheritance polymorphism


【解决方案1】:

我为我工作。

ideone.com/RRfau

您确实应该包含一些带有此类问题的示例代码,以便我们为您提供帮助。

#include <iostream>
#include <typeinfo> 

class Bird
{
public:
   virtual ~Bird() {}
   virtual int chirp() { return 0; }
};

class SomeOtherBird : public Bird
{
public:
   virtual int chirp() { return 1; }
};

void nest( Bird& x )
{
   std::cout << typeid(x).name() << " says " << x.chirp() << '\n';
}

int main()
{
   SomeOtherBird s;
   nest( s );

   Bird b;
   nest( b );
}

【讨论】:

    【解决方案2】:

    工作正常,如下所示。也许您可能没有将基本方法设为虚拟。或者代码有其他错误,由于代码没有贴出来,所以无法判断。

    #include <iostream>
    using namespace std;
    
    class Bird
    {
    public:
        Bird() {}
        ~Bird() {}
        virtual int Chrip() { cout << "Bird version" << endl; return 0; }
    };
    
    class SomeOtherBird:public Bird
    {
     public:
        SomeOtherBird() {}
        ~SomeOtherBird() {}
        virtual int Chrip() { cout << "SomeOtherBird version" << endl; return 1; }
    };
    
    int nest(Bird &b)
    {
        b.Chrip();
    }
    
    int main()
    {
        SomeOtherBird s;
        Bird &b = s;
        int retcode = nest(b);
        cout << "retcode " << retcode << endl;
    }
    

    输出:

    rhdevblade1-~/cpp: ./virt
    SomeOtherBird version
    retcode 1
    

    【讨论】:

      【解决方案3】:

      如果没有看到您的代码,就不可能肯定地回答您。但是,这听起来像是您没有在基类中编写“virtual Bird()”,而只是在派生类中编写。这行不通。

      class Bird {
      virtual int Bird();
      };
      
      class MoreBird : public Bird {
      int Bird();
      };
      

      派生类中不需要 virtual 关键字(尽管即使 99.9% 的程序员很懒且不这样做,也不将其放在那里是不好的做法。)

      【讨论】:

      • 你可能想再次掩盖你的代码,Bird() 是一个构造函数。
      • 即你不能有一个虚拟构造函数。
      • 好一个 8-) 我看到其他人都遵循了正确的代码。
      猜你喜欢
      • 1970-01-01
      • 2013-05-25
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多