下面的代码有问题,如何改正?且如何将fly,swim动作以接口的形式剥离出来呢?

class Bird
{
virtual void fly();  //birds can fly
void travel() { fly(); } //birds travel by flying
}
class Eagle: public Bird
{
virtual void fly() {/* implement the flying code here */}
}
class Penguin: public Bird
{
virtual void swim(); //penguins can swim
}
Eagle e();
e.travel();  //OK, eagle can fly
Penguin p();
p.travel();  //Error, penguin can't fly

 

class Bird
{
public:
virtual void travel()= 0;
}

class Eagle: public Bird
{
virtual void travel() { fly(); }
void fly() {/* implement the flying code here */}
}

class Penguin: public Bird
{
virtual void travel() { swim(); }
void swim() {}
}
Eagle e();
e.travel();  //OK, eagle can fly
Penguin p();
p.travel();  //Error, penguin can't fly

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

C++里interface就是只有pure virtual functions的abstract class。

下面是改写后的代码。

class Bird 
{
public:
    virtual void fly(); //birds can fly

    virtual void travel() 
    {
        fly();
    } //birds travel by flying
}

class Eagle: public Bird 
{
public:
    virtual void fly()
    {
        /* implement the flying code here */
    }
}

abstract class Swimmable
{
public:
    virtual void swim() = 0;    
}

class Penguin: public Bird, public Swimmable
{
public:
    virtual void swim()
    {
        // implement penguin swim
    }

    virtual void fly()
    {
        // provide trivial implementation for fly(), which does not apply to penguin, to shut up compiler
    }

    virtual void travel() 
    {
        swim();
    }
}

Eagle e();
e.travel(); //OK, eagle can fly
Penguin p();
p.travel(); //Ok, penguin travel by swim