C++基类和派生类赋值问题

时间:2022-09-07 23:56:53
#include <iostream>

using namespace std;

class A
{
private:
int i;
public:
A()
{
i = 0;
}
A(int t)
{
i = t;
}
A(A &aa)
{
i = aa.i;
}
void show() const
{
cout << "i: " << i << endl;
}
};

class B:public A
{
private:
int x;
int y;
public:
B()
{
x = 0;
y = 0;
}
B(int t1, int t2, int t3):A(t3)
{
x = t1;
y = t2;
}
void show() const
{
cout << "x: " << x << endl;
cout << "y: " << y << endl;
A::show();
}
};

int main()
{
A aa(60);
aa.show();
cout<< endl;

B bb(90,20,800);
bb.show();
    cout << endl;

A aa1;
aa1 = bb; //为什么bb可以赋值给aal
aa1.show();

return 0;
}

请解释下面的问题:
1:为什么派生类可以赋值给基类
2; 派生类(bb)赋值给基类(aa1)后,为什么输出aa1.show()是800,而不是90或者20,他是怎么确定从派生类中找到i的变量然后赋给基类中i的变量.

9 个解决方案

#1


调用A(A & aa){i=aa.i}。
派生类对象本身就包含一个基类对象,这个基类的对象i=800。

#2



void show() const
{
cout << "x: " << x << endl;
cout << "y: " << y << endl;
A::show(); //你将派生类赋值给基类,会被截断,导致你这里会输出800
}

#3


因为对象bb的内存结构里,开始是一个A,然后才是自己的数据
《inside the c++ object model》讲的很详细。

#4


这个派生类B和基类的关系是A
B是A类型也就是所说的IS A的关系,所以派生类可以通过截断处理复制给基类

#5


1:为什么派生类可以赋值给基类
汽车可不可以被称作交通工具呢,如果在一个财产公示表格中,有个交通工具选项,那你可以填上汽车. 
2; 派生类(bb)赋值给基类(aa1)后,为什么输出aa1.show()是800,而不是90或者20,他是怎么确定从派生类中找到i的变量然后赋给基类中i的变量.
这个很简单,因为aa1是基类对象,编译器就根据aa1的对象类型,直接生成调用aa1里面show方法的代码了.

#6


每个派生类包含一个基类对象

#7


A 和 B就不是同一个类型的 类型强转都冒着一定的风险

#8


1.因为 儿子是 父亲生的 所以 儿子含有父亲的基因 
2.
B(int t1, int t2, int t3):A(t3) //仔细看 你这A(t3) 调用了 A的构造函数    
 {         x = t1;         y = t2;     } 

 A(int t)     {         i = t;     } //然后这是A的构造函数
根据你的调用 所以 aa.show()输出i为800不奇怪了

#9


很基础的派生问题:这种直接赋值得益于编译器的处理,编译器会把B中A的部分赋值给A。如5楼所解释那样。A是交通工具,有个属性i:可以行使,B是辆保时捷,它有x属性:豪车,y属性:4个*,它也具备i属性:飞速行使。这样,aa1 = bb; 就不难理解了。所以,aa1这个交通工具不一般:可以飞速行使。

#1


调用A(A & aa){i=aa.i}。
派生类对象本身就包含一个基类对象,这个基类的对象i=800。

#2



void show() const
{
cout << "x: " << x << endl;
cout << "y: " << y << endl;
A::show(); //你将派生类赋值给基类,会被截断,导致你这里会输出800
}

#3


因为对象bb的内存结构里,开始是一个A,然后才是自己的数据
《inside the c++ object model》讲的很详细。

#4


这个派生类B和基类的关系是A
B是A类型也就是所说的IS A的关系,所以派生类可以通过截断处理复制给基类

#5


1:为什么派生类可以赋值给基类
汽车可不可以被称作交通工具呢,如果在一个财产公示表格中,有个交通工具选项,那你可以填上汽车. 
2; 派生类(bb)赋值给基类(aa1)后,为什么输出aa1.show()是800,而不是90或者20,他是怎么确定从派生类中找到i的变量然后赋给基类中i的变量.
这个很简单,因为aa1是基类对象,编译器就根据aa1的对象类型,直接生成调用aa1里面show方法的代码了.

#6


每个派生类包含一个基类对象

#7


A 和 B就不是同一个类型的 类型强转都冒着一定的风险

#8


1.因为 儿子是 父亲生的 所以 儿子含有父亲的基因 
2.
B(int t1, int t2, int t3):A(t3) //仔细看 你这A(t3) 调用了 A的构造函数    
 {         x = t1;         y = t2;     } 

 A(int t)     {         i = t;     } //然后这是A的构造函数
根据你的调用 所以 aa.show()输出i为800不奇怪了

#9


很基础的派生问题:这种直接赋值得益于编译器的处理,编译器会把B中A的部分赋值给A。如5楼所解释那样。A是交通工具,有个属性i:可以行使,B是辆保时捷,它有x属性:豪车,y属性:4个*,它也具备i属性:飞速行使。这样,aa1 = bb; 就不难理解了。所以,aa1这个交通工具不一般:可以飞速行使。