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