Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以及为什么可以更改成员的访问级别?_C++_Oop - Fatal编程技术网

C++ 如何以及为什么可以更改成员的访问级别?

C++ 如何以及为什么可以更改成员的访问级别?,c++,oop,C++,Oop,我昨天(在一些帮助下)编写了这样的代码: #include <iostream> using namespace std; class A { public: virtual void foo(){cout << "A::foo\n";} }; class B : private A { private: virtual void foo(){ cout << "B::foo\n";} vo

我昨天(在一些帮助下)编写了这样的代码:

#include <iostream>

using namespace std;

class A
{
    public:
        virtual void foo(){cout << "A::foo\n";}
};

class B : private A
{
    private:
        virtual void foo(){ cout << "B::foo\n";}
        void DoSomething(SomeOtherClass& o){o.DoSomething(*static_cast<A*>(this));}
};
#包括
使用名称空间std;
甲级
{
公众:

虚拟虚空(){CUT

可能不会直接回答所有问题,但我决定把它放在这里,以备将来参考。也请用一点点盐来取它,因为这是基于我对C++标准世界中发生的事件的理解,而不是实际的。 阅读。我没有手臂,但文章给出了必要的细节

C++0x中的注释115表示

115)访问声明是 已弃用;成员使用声明 (7.3.3)提供更好的 做同样的事情。在早些时候 C++语言的版本,访问 声明更为有限;它们 被推广并等价 为了利益而使用声明 简单。程序员是 鼓励使用声明, 而不是 新代码中的访问声明

总之:

我认为手臂一开始禁止它:

不能使用访问声明 限制对以下成员的访问: 可以在基类中访问,也可以 它可用于启用对数据库的访问 在中不可访问的成员 基类

但后来我猜,当标准使用名称空间std发展时,

;
甲级
{ 
公众:

virtual void foo(){cout您认为错误在哪里?在函数声明为private时?还是在函数调用时?我很好奇。希望找到一个解释此功能可能用法的答案(?)。一种用法可能是强制程序员将类B实例化为指向基类a的指针,以便使用它的接口。但我不知道为什么这会是一件好事。@PigBen:我认为在第二种情况下
B
foo
的定义会出错。@manneorama:检查我昨天发布的这个问题。它来自很明显,我得到了这个:)。很容易看出它的工作原理。但如果不允许在B中将foo()设为私有,它会更有意义。所以我认为问题是,设计决策背后的基本原理是什么。@kotlinski:有一种非常著名的设计模式,叫做“模板方法”模式,它利用了这个原理。请检查一下。我看不出这与模板方法设计模式之间有什么联系。模板方法模式在基类和派生类中都使用private。这很有意义。在这种情况下,将访问权限从public改为private似乎令人困惑。private并不意味着任何有用的东西-它是我们仍然可以通过基类调用所谓的“private”函数。“finally allowed”现在,它们被弃用了。这个答案有一个更好的引语:
class B : public A
{
    private:
        virtual void foo(){ cout << "B::foo\n";}
};

int main()
{
    A* a = new B;
    a->foo();
}
using namespace std; 

class A 
{ 
    public: 
        virtual void foo(){cout << "A::foo\n";} 
}; 

class B : public A 
{ 
    private: 
        virtual void foo(){ cout << "B::foo\n";} 
}; 

int main() 
{ 
    A* a = new B; 
    a->foo(); 
}