关于继承的一段代码,不明白~~

时间:2022-10-02 02:43:32
class A
{
public:
    A(){i=1;d=1.2;}
    int i;
    double d;
};
class B:public A
{
public:
   B(){i=2;d=2.2;}
   int i;
};
class C:public B
{
public:
   C(){i=3;i=3.2;}
   double d;
}
int main()
{
    C derived2;
    B* pderived;
    A* pbase;
    cout<<derived2.i<<derived2.d<<endl;
    cout<<pderived->i<<pderived2->d<<endl;
    cout<<pbase->i<<pbase->d<<endl;
}

对于以上的代码看的有点晕,请人指点迷津~~是否和虚函数类似?

6 个解决方案

#1


int main()
{
    C derived2;
    B* pderived =&C ;
    A* pbase=&C;
    
    cout<<derived2.i<<derived2.d<<endl;
    cout<<pderived->i<<pderived2->d<<endl;
    cout<<pbase->i<<pbase->d<<endl;
}

忘了写=了。

#2


B* pderived =&C ;
    A* pbase=&C;
错了.

#3


变量查找循序C->B->A

#4


这个跟构造顺序有关的,
类实例在构造时,先构造它的基类成员,
于是C构造时,要先构造B,而B构造时又要先构造A。

1、构造A,A.i=1, A.d=1.2

2、构造B,B的i已经与A的i无关,但是B与A共用d,
所以,B构造i=2时,不影响A.i,
B构造d=2.2时影响了A.d
A.i=1, A.d=2.2, B.i=2, B.d=2.2

3、构造C时,C的d不影响B的d,但是C的i会影响B的i
a.i=1, a.d=2.2, b.i=3, b.d=2.2, c.i=3, c.d=3.2

明白了没?

#5


如果还有疑问,你就再加三行代码:
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
cout<<sizeof(C)<<endl;
看看它们占多少内存,就能想像它们的变量是怎么相处的。

#6


谢谢 toumao

#1


int main()
{
    C derived2;
    B* pderived =&C ;
    A* pbase=&C;
    
    cout<<derived2.i<<derived2.d<<endl;
    cout<<pderived->i<<pderived2->d<<endl;
    cout<<pbase->i<<pbase->d<<endl;
}

忘了写=了。

#2


B* pderived =&C ;
    A* pbase=&C;
错了.

#3


变量查找循序C->B->A

#4


这个跟构造顺序有关的,
类实例在构造时,先构造它的基类成员,
于是C构造时,要先构造B,而B构造时又要先构造A。

1、构造A,A.i=1, A.d=1.2

2、构造B,B的i已经与A的i无关,但是B与A共用d,
所以,B构造i=2时,不影响A.i,
B构造d=2.2时影响了A.d
A.i=1, A.d=2.2, B.i=2, B.d=2.2

3、构造C时,C的d不影响B的d,但是C的i会影响B的i
a.i=1, a.d=2.2, b.i=3, b.d=2.2, c.i=3, c.d=3.2

明白了没?

#5


如果还有疑问,你就再加三行代码:
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
cout<<sizeof(C)<<endl;
看看它们占多少内存,就能想像它们的变量是怎么相处的。

#6


谢谢 toumao