#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。
派生类对象本身就包含一个基类对象,这个基类的对象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》讲的很详细。
《inside the c++ object model》讲的很详细。
#4
这个派生类B和基类的关系是A
B是A类型也就是所说的IS A的关系,所以派生类可以通过截断处理复制给基类
B是A类型也就是所说的IS A的关系,所以派生类可以通过截断处理复制给基类
#5
1:为什么派生类可以赋值给基类
汽车可不可以被称作交通工具呢,如果在一个财产公示表格中,有个交通工具选项,那你可以填上汽车.
2; 派生类(bb)赋值给基类(aa1)后,为什么输出aa1.show()是800,而不是90或者20,他是怎么确定从派生类中找到i的变量然后赋给基类中i的变量.
这个很简单,因为aa1是基类对象,编译器就根据aa1的对象类型,直接生成调用aa1里面show方法的代码了.
汽车可不可以被称作交通工具呢,如果在一个财产公示表格中,有个交通工具选项,那你可以填上汽车.
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不奇怪了
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。
派生类对象本身就包含一个基类对象,这个基类的对象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》讲的很详细。
《inside the c++ object model》讲的很详细。
#4
这个派生类B和基类的关系是A
B是A类型也就是所说的IS A的关系,所以派生类可以通过截断处理复制给基类
B是A类型也就是所说的IS A的关系,所以派生类可以通过截断处理复制给基类
#5
1:为什么派生类可以赋值给基类
汽车可不可以被称作交通工具呢,如果在一个财产公示表格中,有个交通工具选项,那你可以填上汽车.
2; 派生类(bb)赋值给基类(aa1)后,为什么输出aa1.show()是800,而不是90或者20,他是怎么确定从派生类中找到i的变量然后赋给基类中i的变量.
这个很简单,因为aa1是基类对象,编译器就根据aa1的对象类型,直接生成调用aa1里面show方法的代码了.
汽车可不可以被称作交通工具呢,如果在一个财产公示表格中,有个交通工具选项,那你可以填上汽车.
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不奇怪了
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这个交通工具不一般:可以飞速行使。