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
相关产品推荐
相关产品推荐

