功能无法访问(C ++)

时间:2018-04-12 19:32:45

标签: c++ c++11

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

ssh -n server2

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

顺便说一下:有没有办法将代码复制到代码块中?我现在必须把所有空间放在一切的前面。那么有更简单的方法吗?

亲切的问候,

鲍勃

2 个答案:

答案 0 :(得分:2)

最简单的代码可以重现您已经设法提出的问题:

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

class B : A
{
};

int main()
{
    B a;
    a.foo();
}

显然无法编译:

$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();
            ^

但是当你改变

 class B : A

 class B : public A

它会编译得很好。

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

  

如果省略access-specifier,则默认为类为public   使用class-key结构声明,并声明为声明的私有   使用class-key类。

所以你引发了私人继承" - http://en.cppreference.com/w/cpp/language/derived_class#Private_inheritance

  

当类使用私有成员访问说明符从a派生时   base,基类的所有公共成员和受保护成员   可作为派生类的私有成员访问(私有成员)   除非有朋友,否则永远无法进入基地。

答案 1 :(得分:0)

两个问题:

(1)非纯虚函数:

virtual void fly();

(2)Default access个类是私有的。

class IFlyBehavior

有了这个,为了解决(1),我相信OOP上下文中的接口是抽象类,你需要实现它。

对于(1),您需要将该函数声明为pure virtual,以使class IFlyBehavior成为abstract class

class IFlyBehavior {
   virtual void fly() = 0; // pure virtual function
                           // making IFlyBehavior as abstract class
};

对于(2),您可以将实施Duck的具体课程IFlyBehavior作为结构,以获得公开默认访问权限。

struct Duck: IFlyBehavior { // Let the whole world know that ducks fly
    inline void fly() { // define how ducks fly
        std::cout << "can fly in v-formation" << std::endl;
    }
};