You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中Duck::fly()与Duck::quack()函数不可访问问题求助

解决Duck类成员方法不可访问的问题

嘿,我来帮你搞定这个报错!你遇到的Duck::fly()和Duck::quack()不可访问的问题,大概率是类成员权限设置不对——你应该是把这两个方法声明成了private或者protected,而main函数属于外部作用域,没法直接调用类的私有/保护成员。

结合你在学设计模式(鸭子行为是策略模式的经典案例),我给你整理了修复后的完整代码,同时兼顾C++语法规范和设计模式的思路:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

// 基类Duck:将核心行为设为public虚函数,方便子类重写
class Duck {
public:
    // 纯虚函数,强制子类实现自定义行为
    virtual void fly() const = 0;
    virtual void quack() const = 0;
    virtual ~Duck() = default; // 虚析构函数,避免内存泄漏
};

// 绿头鸭:实现真实鸭子的行为
class MallardDuck : public Duck {
public:
    void fly() const override {
        cout << "我是绿头鸭,我会飞得很高!" << endl;
    }

    void quack() const override {
        cout << "嘎嘎嘎!" << endl;
    }
};

// 橡皮鸭:实现橡皮鸭的特殊行为
class RubberDuck : public Duck {
public:
    void fly() const override {
        cout << "我是橡皮鸭,我不会飞..." << endl;
    }

    void quack() const override {
        cout << "吱吱吱!" << endl;
    }
};

int main() {
    std::cout << "Object Oriented Pattern:\n\n";
    MallardDuck Duck1;
    Duck1.fly();
    Duck1.quack();
    
    RubberDuck Duck2;
    Duck2.fly();
    Duck2.quack();

    std::cin.get(); // 暂停程序,方便查看输出
    return 0;
}

关键修复点说明:

  • 把Duck类的fly()和quack()设为public权限,确保外部(比如main函数)可以直接调用。
  • 声明为纯虚函数(=0),强制子类必须实现自己的行为,符合面向对象的多态思想。
  • 添加虚析构函数,避免基类指针指向子类对象时出现内存泄漏。
  • 子类重写方法时用override关键字,明确表示是重写基类的虚函数,避免拼写错误。

如果后续你想深入策略模式,还可以把fly和quack的行为抽成独立的接口(比如FlyBehavior、QuackBehavior),让鸭子类组合这些行为而非继承,这样行为的扩展会更灵活——不过先搞定当前的权限问题是第一步~

内容的提问来源于stack exchange,提问作者Bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:04:16