C++ polymorphism

C++ polymorphism

本文关键字:polymorphism C++      更新时间:2023-10-16

我有一个奇怪的问题,我肯定有一个简单的解决办法。我有一个超类,我们叫它"鸟"。Bird有一个叫chirp的虚拟函数,它返回0。我还有一个子类叫它SomeOtherBird。SomeOtherBird是Bird的一个子类。我的子类的chirp()函数应该返回1。

:

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

其他一些鸟是鸟的子类。

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

:巢(Bird&x)

如果我传入一个SomeOtherBird,我调用Chirp,它调用主超类的虚函数,而不是子类的虚函数,所以例如:

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

如何在子类中调用函数,而不是虚拟主函数?

谢谢

我为我工作。

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 );
}

工作正常,如下所示。也许您没有将基方法设置为虚方法。或者代码中有其他错误,因为代码没有发布,所以无法判断。

#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

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

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

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