class base{
private:
int a;
public:
int b;
void setData(){
a = 10; b = 5;
}
};
class derived: public base{
private:
int c;
public:
// b is inherited
};
void main(){
derived D1;
D1.setData();
}
我了解到私人成员并没有被继承。因此,派生类对象中不存在私有变量a(在基类中)。我的问题是当调用D1.setData()时,如果不存在,它如何为a赋值? 我很确定我的这个概念是错误的,所以有人可以解释一下这是如何工作的吗?是否在创建派生类对象时创建了基类成员?
答案 0 :(得分:1)
我了解到私人成员不会被继承。
当然它们是继承的:否则,需要这些私有变量的基类的所有成员函数都将被破坏。尽管继承类无法访问私有成员,但基类仍保留对它们的完全访问权限。
有人可以解释一下这是如何工作的吗?
继承类derived
的布局包括存储基类私有成员a
的位置。基类的所有方法都可以访问base::a
。同时,派生类仍然无法访问:任何从a
访问derived
的尝试都会导致编译时错误。
答案 1 :(得分:0)
私有成员变量是继承的,但无法从外部访问。继承的内存模式很简单:
class base {
int x;
};
class subclassCpp : public base {
int y;
};
class subclassCStyle {
base a;
int y;
};
现在,subclassCpp
和subclassCStyle
具有完全相同的内存模式,无论私有/受保护状态等等。这应该说明内存的布局方式。
对于另一个问题,“在创建派生类对象时是否也创建了基类成员?”
答案是肯定的,总是在基类上调用构造函数。如果您不自己添加,则会自动调用默认构造函数。如果基类没有默认构造函数,它将不允许您创建一个子类构造函数,该构造函数无法正确调用初始化基础所需的构造函数。因此,只要子类中的构造函数被执行,就没有合法的方法可以最终得到创建子类时尚未初始化的基类。