是什么区别public,private以及protected用C++继承?我在SO上发现的所有问题都涉及具体案例.
为什么这种创建私有类方法的方法有效:
class Person
def self.get_name
persons_name
end
class << self
private
def persons_name
"Sam"
end
end
end
puts "Hey, " + Person.get_name
puts "Hey, " + Person.persons_name #=> raises "private method `persons_name' called for Person:Class (NoMethodError)"
Run Code Online (Sandbox Code Playgroud)
但这不是:
class Person
def self.get_name
persons_name
end
private
def self.persons_name
"Sam"
end
end
puts "Hey, " + Person.get_name
puts "Hey, " + Person.persons_name
Run Code Online (Sandbox Code Playgroud) 在我阅读本文之前,我认为Ruby中的访问控制工作方式如下:
public- 可以被任何对象访问(例如Obj.new.public_method)protected - 只能从对象本身以及任何子类中访问private - 与protected相同,但子类中不存在该方法但是,看起来protected并且private行为相同,除了你不能private用显式接收器调用方法(即self.protected_method工作,但self.private_method没有).
这有什么意义?什么时候你不希望你的方法用显式接收器调用?
该文章已在了解新的访问说明很有帮助Swift 3.它也给出了不同用途的一些例子fileprivate和private.
我的问题是 - 是不是fileprivate在一个仅在此文件中使用的函数上使用与使用相同private?
在C++中创建私有方法虚拟的优点是什么?
我在开源C++项目中注意到了这一点:
class HTMLDocument : public Document, public CachedResourceClient {
private:
virtual bool childAllowed(Node*);
virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
};
Run Code Online (Sandbox Code Playgroud) 所以我刚开始阅读一本Java书并想知道; 如果没有指定,哪个访问说明符是默认值?
我有两个问题
最佳实践
这些是我能看到的选项,哪个最好?:
技术部分
有没有办法制作私有模块方法?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
Run Code Online (Sandbox Code Playgroud)
在private中似乎有没有什么影响,我仍然可以调用Thing.priv没有问题.
我了解到我永远不能访问私有变量,只能使用类中的get函数.但是为什么我可以在复制构造函数中访问它?
例:
Field::Field(const Field& f)
{
pFirst = new T[f.capacity()];
pLast = pFirst + (f.pLast - f.pFirst);
pEnd = pFirst + (f.pEnd - f.pFirst);
std::copy(f.pFirst, f.pLast, pFirst);
}
Run Code Online (Sandbox Code Playgroud)
我的声明:
private:
T *pFirst,*pLast,*pEnd;
Run Code Online (Sandbox Code Playgroud) class A
private
def initialize
puts "wtf?"
end
end
A.new #still works and calls initialize
Run Code Online (Sandbox Code Playgroud)
和
class A
private
def self.new
super.new
end
end
Run Code Online (Sandbox Code Playgroud)
不起作用
那么正确的方法是什么?我想new私有化并通过工厂方法调用它.
我们都知道protected从基类指定的成员只能从派生类自己的实例访问.这是标准的一个特性,这已在Stack Overflow上多次讨论:
但似乎有可能用成员指针来解决这个限制,因为用户chtz 向我展示:
struct Base { protected: int value; };
struct Derived : Base
{
void f(Base const& other)
{
//int n = other.value; // error: 'int Base::value' is protected within this context
int n = other.*(&Derived::value); // ok??? why?
(void) n;
}
};
Run Code Online (Sandbox Code Playgroud)
为什么这可能,它是一个想要的功能或实施中的某个地方或标准的措辞?
从评论中出现了另一个问题:如果Derived::f用实际调用Base,是不确定的行为?
c++ protected access-specifier member-pointers language-lawyer
access-specifier ×10
c++ ×4
ruby ×4
private ×2
c++-faq ×1
constructor ×1
inheritance ×1
java ×1
polymorphism ×1
protected ×1
swift ×1
swift3 ×1