我正在研究一些代码来理解一些设计模式。我正在研究C#和C ++以更好地理解这两种语言。以下代码给出了Duck :: fly()和Duck :: quack()无法访问的错误。任何人都可以帮我解决这个错误吗?
ssh -n server2
我不知道为什么这是不可访问的,因为duck中的函数被声明为public。
顺便说一下:有没有办法将代码复制到代码块中?我现在必须把所有空间放在一切的前面。那么有更简单的方法吗?
亲切的问候,
鲍勃
答案 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;
}
};