函数不可访问(C++)

Bob*_*Bob -1 c++ c++11

我正在编写一些代码来理解一些设计模式。我正在研究 C# 和 C++,以更好地理解这两种语言。以下代码给出了 Duck::fly() 和 Duck::quack() 不可访问的错误。有人能帮我解决这个错误吗?

#include "stdafx.h"
#include "iostream"
#include "string"

using namespace std;

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

class IFlyBehavior
{
public:
    virtual void fly();
};

class IQuackBehavior
{
public:
    virtual void quack();
};

class Duck
{
protected:
    IFlyBehavior FlyBehavior;
    IQuackBehavior QuackBehavior;

public:
    void fly()
    {
        FlyBehavior.fly();
    }
    void quack()
    {
        QuackBehavior.quack();
    }
};

class RubberDuck : Duck
{
public:
    RubberDuck() : Duck()
    {
        NoFly FlyBehavior;
        Squeak QuackBehavior;
    }
};

class MallardDuck : Duck
{
public:
    MallardDuck() : Duck()
    {
        FlyWithWings FlyBehavior;
        Quack QuackBehavior;
    }
    ~MallardDuck() { };
};

class FlyWithWings : IFlyBehavior
{
    void fly()
    {
        cout << "Flapping wings.";
    }
};

class NoFly : IFlyBehavior
{
    void fly()
    {
        cout << "Can't fly.";
    }
};

class Quack : IQuackBehavior
{
    void quack()
    {
        cout << "Quack!";
    }
};

class Squeak : IQuackBehavior 
{
    void quack()
    {
        cout << "Squeak!";
    }
};
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这是不可访问的,因为duck 中的函数被声明为public。

顺便说一句:有没有办法将代码复制到代码块中?我现在不得不把所有的空间都放在一切的前面。那么有没有更简单的方法来做到这一点?

亲切的问候,

鲍勃

lua*_*kow 5

重现我设法想出的问题的最简单的代码是:

// main.cpp
class A
{
public:
    void foo() { };
};

class B : A
{
};

int main()
{
    B a;
    a.foo();
}
Run Code Online (Sandbox Code Playgroud)

它显然不能编译:

$gcc main.cpp
main.cpp: In function ‘int main()’:
main.cpp:15:12: error: ‘void A::foo()’ is inaccessible within this context
      a.foo();
            ^
main.cpp:5:11: note: declared here
      void foo() { };
           ^~~
main.cpp:15:12: error: ‘A’ is not an accessible base of ‘B’
      a.foo();
            ^
Run Code Online (Sandbox Code Playgroud)

但是当你改变

 class B : A
Run Code Online (Sandbox Code Playgroud)

 class B : public A
Run Code Online (Sandbox Code Playgroud)

它会编译得很好。

如果使用class关键字定义类型,则私有访问是隐式的。请参阅:http : //en.cppreference.com/w/cpp/language/derived_class

如果省略了 access-specifier,则对于使用 class-key 结构声明的类默认为 public,对于使用 class-key class 声明的类默认为 private。

所以你触发了“私有继承” - http://en.cppreference.com/w/cpp/language/derived_class#Private_inheritance

当一个类使用私有成员访问说明符从基类派生时,基类的所有公共成员和受保护成员都可以作为派生类的私有成员访问(基类的私有成员永远不能访问,除非是友元的)。