与sizeof派生类混淆

时间:2013-10-05 07:54:24

标签: c++ inheritance sizeof

class base
{
  private:
  int a;
  };
class base2
{
  private:
  int b;
  };
class derived:public base,public base2
{
  private:
  int c;
  };
main()
{
  base b;
  derived d;
  cout<<size of(base)<<size of(base2)<<size of(derived);
}

因为int a和int b是私有变量。所以它们不会在派生类中继承。所以输出应该是4 4 4但它是 输出:4 4 12 为什么呢?

2 个答案:

答案 0 :(得分:6)

  

因为int aint b是私有变量。所以它们不会在derived类中继承

这是错的 - 当然它们是继承的,基类中的代码如果没有它们就无法工作。只是derived无法访问它们,但它不会更改派生类的sizeof

考虑你的例子的这个扩展:

class base {
private:
    int a;
protected:
    base() : a(123) {}
    void showA() {cout << a << endl;}
};

class base2 {
private:
    int b;
protected:
    base2() : b(321) {}
    void showB() {cout << b << endl;}
};

class derived:public base,public base2 {
private:
    int c;
public:
    derived() : c (987) {}
    void show() {
        showA();
        showB();
        cout << c << endl;
    }
};

即使您的derived课程无法阅读或更改ab,它也可以通过调用其基础中的相应功能来显示其值。因此,变量必须保留在那里,否则showAshowB成员函数将无法完成其工作。

答案 1 :(得分:0)

成员字段上的

private:protected:public:注释仅影响可见性。但是这些领域仍在课堂上。

花几天时间阅读一本好的C ++编程书。