c++子类不能从父类继承私有成员
C ++ Child class cannot inherit private member from Father class?
我使用的是Win8 vc++ 2012。
上面的代码显示子类B在任何情况下都不能访问A:: A。也不能修改A:: A的访问属性,只能修改A::b和A::c。
所以A::c不是从A继承到B的,但是sizeof(A)和sizeof(B)分别是12和24,这意味着A:: A占用了B的内存
- B怎么能把A:: A存储在它的内存中,而永远不能访问它?
- c++入门书中说,我们可以恢复基类成员的访问属性,但不能改变它。这里我的代码显示,我可以在b中将A::b的访问属性从protected更改为public。
代码如下:
#include <iostream>
using namespace std;
class A
{
private:
int a;
protected:
int b;
public:
int c;
A(int a, int b, int c): a(a), b(b), c(c)
{
cout << "A: ";
cout << a << " ";
cout << b << " ";
cout << c << endl;
}
};
class B: protected A
{
private:
int d;
protected:
int e;
//using A::a; COMPILE ERROR
public:
int f;
//A::a; COMPILE ERROR
using A::c; //RESTORE A::c public access
A::b; // change A::b from protected to public
B(int d, int e, int f): A(d, e, f), d(d), e(e), f(f)
{
cout << "Bn";
//cout << a << endl; COMPILE ERROR
cout << b << " ";
cout << c << " ";
cout << d << " ";
cout << e << " ";
cout << f << endl;
}
};
int main()
{
A a(1,2,3);
B b(4,5,6);
cout << "sizeof(A)=" << sizeof(A) << endl; //OUTPUT 12
cout << "sizeof(B)=" << sizeof(B) << endl; //OUTPUT 24
return 0;
}
子节点继承父节点的私有成员,但不能访问。将它们设为protected
class A
{
protected: // <<------------ make `a` as protected in parent
int a;
所以A::c不能从A继承到B
你的意思是
所以A:: A不能从A继承到B
但即便如此,它也确实是遗传的。它只是不能直接访问。然而,B
仍然有a
。
为什么这是必要的?因为你可以在A
中有公共方法可以设置或获取a
的值,这些函数可以间接地让B访问自己的a
。
class A {
private:
int a; // a is private
public:
void set_a(int i) {a = i;}
};
class B : protected A {
public:
using A::set_a; // we bring set_a to public access
};
int main() {
B b;
b.set_a(2); // change b.a indirectly
b.a = 2; // Error
}
当您使用继承时,您正在创建基类的实例以及派生类的实例。基类内部的所有成员都是在实例化派生类时构造的,即使派生类无法访问它们。
如果您需要成员在基类中为私有,但仍希望在派生类中访问它。在基类中创建一个受保护的访问器,使您能够访问私有成员。
protected:
int &geta() { return a; }
我不知道是什么问题:
B是A,这就是为什么即使B不能访问它,A属性也会占用一些空间。
如果有一个公共方法geta()返回a,如果a不在B中,它怎么可能返回a呢?
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何从另一个文件继承私有成员变量和公共函数
- C++继承更改成员
- 继承和友元函数,从基类访问受保护的成员
- 删除C++继承中虚拟类成员的代码重复
- 成员包含其他继承类的继承类?
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- enable_if继承的成员函数的名称查找错误
- 初始化依赖于子类的继承类的常量类成员
- 继承:调用基类的成员和方法
- 类设计:类成员继承自同一基类
- 使用 CRTP 进行选择性静态成员继承
- 具有'using'的模板模板成员继承
- 结构绑定:与公共数据成员(继承的基类)结合
- 为什么C++继承不允许基类的公共成员继承到派生类的私有成员?
- 静态成员继承和保护
- 是否可以检查是否为类定义了成员函数,即使该成员继承自未知基类
- 混合模板/非模板继承分类和成员继承