我对遗传的一些概念有疑问,我说的是我所知道的,如果我错了,请纠正我。
基类的私有成员由派生类继承,但派生类无法以任何方式访问它们。
基类的受保护成员由派生类继承,但派生类不能直接访问它,而是通过其某些成员函数的帮助。
现在在以下代码中:
class A
{
protected:
A(const A&){}
A operator=(const A &){}
int t;
public:
A(int r) {t=r;}
A(){t=0;}
};
class B : public A
{
A a;
public:
void make(void)
{
//A b(a); //LINE 1 -------COPY CONSTRUCTOR BEING CALLED ---protected member of base class
cout<<t; //LINE 2 -------protected member of base class
}
};
int main()
{
B b;
b.make();
return 0;
}
为什么LINE 1出现错误?
为什么我们不能为A的对象调用copy-constructor?
提前许多次
答案 0 :(得分:5)
受保护的成员只能在构造,销毁期间或通过this
指针(*)时由同一个完整对象的其他成员访问。
在示例类层次结构中,B
对象有两个类型为A
的子对象:
A
和a
的数据成员子对象,它通过声明a
得到。 B
的成员只能访问第一个A
子对象的受保护成员,而不是第二个受保护成员,因为只有第一个直接使用this
指针(请注意您的表达式{ {1}}在语义上等同于cout << t
)。
访问数据成员的成员不直接使用cout << this->t
指针:如果您尝试从this
访问this->a.t
,则不使用B::make
指针直接访问this
。在您的声明t
中,复制构造函数不是针对A b(a);
而是针对您正在构建的新this
对象,而是名为A
的局部变量。
(*)或者,当然,由类中任何声明它的成员:b
的任何成员函数都可以调用B
<的任何其他成员函数/ p>