目前,我正在学习OOP,并且我尝试了许多继承示例。我刚刚测试了这段代码:
struct Basic : public Material
{
Basic() = default;
virtual std::unique_ptr<Material> clone() const override
{
return std::make_unique<Basic>( *this );
}
virtual int get_color() const override
{
return 1;
}
};
为什么这样做?为什么我可以使用#include <iostream>
using namespace std;
class B
{
int a;
protected:
B(int i=0)
{
a=i;
}
int get_b()
{
return a;
}
};
class D: private B
{
public:
D(int x=0): B(x) {}
int get_a()
{
return get_b();
}
};
int main()
{
D d(-89);
cout << d.get_a();
return 0;
}
函数?为什么构造函数get_b()
有效?如果我将B(x)
更改为protected
,那么为什么它不起作用?
稍后编辑:在构造函数和函数private
上使用protected
关键字意味着如果继承是公共的,派生类可以访问它们。但是,在这种情况下,通过使用私有继承,我希望构造函数和get_b()
函数在类get_b()
中是不可用的。
答案 0 :(得分:1)
为什么我可以使用get_b()函数?
因为get_b()
是protected
并且可以由派生类使用。
为什么构造函数B(x)有效?
同样的原因,它是protected
,在这种情况下可以通过派生类D
访问。
如果我将protected更改为private,为什么它不起作用?
由于private
成员只能由类本身访问(在本例中为B
)并且是朋友,D
无法访问private
B
成员}。
稍后编辑:通过在构造函数和函数上使用protected关键字get_b()意味着派生类可以访问如果继承是公共的。
声明中的粗体部分不正确。继承说明符说明如何在类B
的子级和用户中访问D
成员,它不会将类D
的方法的访问权更改为类B
的成员。< / p>
但是,在这种情况下,通过使用私有继承,我希望类
D
中的构造函数和get_b()函数不可用。
你的期望是错误的。私有继承会使类B
中的成员无法访问类D
的子级和用户,它不会影响B
成员对D
本身方法的可访问性。
答案 1 :(得分:0)
实际上,公共,受保护和私有继承指定将应用于继承成员的最自由的访问控制。我的意思是:
class Pub : public B
B
继承的Pub
的公开成员将在Pub
本身和外部(以及从Pub
派生的任何类中)访问。受B
继承的Pub
受保护成员可在Pub
内以及Pub
派生的类中访问。 B
中的私人成员将无法在Pub
内访问。
另一种表达方式:B
的公众成员仍然是公开的,受保护的成员仍然受到保护,私人成员无法访问。
class Prot : protected B
B
继承的Prot
的公共成员和受保护成员将像Prot
的受保护成员一样可以访问:在类本身内以及从它派生的类中,但不能从外部访问。 B
仍然无法访问Prot
的私人成员。
另一种表达方式:B
的公众成员受到保护,受保护的成员仍然受到保护,私人成员无法访问。
class Priv : private B
B
继承的Priv
的公共成员和受保护成员只能访问Priv
,而不能访问任何派生类(它们可以像{{1}的私有成员一样访问})。 Priv
仍然无法访问B
的私人成员。
另一种表达方式:Prot
的公共成员和受保护成员成为私人成员,私人成员无法访问。
答案 2 :(得分:-2)
私有/受保护/公共继承就是决定谁知道继承。在公共继承中,所有外部代码都知道它。在受保护的继承中,只有孩子知道。在私有中,只有继承类才知道。最重要的是,相同的关键字适用于成员,但不受继承可见性的影响。如果类知道继承,则成员像往常一样可见。如果它不知道继承,它甚至不太了解成员,无论是公共的,私人的还是受保护的。
要回答您的具体问题,如果您创建的课程E继承(公开)您的课程D,您将无法拨打get_b
,但您仍然可以致电get_a
< / p>