用一个派生类对象来初始化其基类,发生了什么?

jndxhdu 2012-06-13 08:55:20
看c++ primer,说用一个派生类对象对其基类对象进行初始化,会调用基类的构造函数,写代码验证:
derived d(6,7,8);
base c=d;
(其中base是基类,derived是派生类,)
但不调用其基类的构造函数(我在构造函数里打印了一个标志语句),不知是什么原因。
...全文
532 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjyuni 2012-08-26
  • 打赏
  • 举报
回复
这个时候不考虑派生类中的访问权限吗?
jndxhdu 2012-06-15
  • 打赏
  • 举报
回复
是调用拷贝构造函数吗?拷贝构造函数不是在属于同一个类的对象之间的相互赋值吗?比如同属于base类的两个对象,但这里是两个不同的类之间的赋值呀。。[Quote=引用 10 楼 的回复:]

具体过程是这样的~

derived d(6,7,8);

base c=d;

这里的d 先转换成 base类,然后调用base的拷贝构造函数,因为你的base 没有定义Copy构造函数,就调用默认的,字节Copy。

这样定义你就能看明白真正的工作原理了。

class CA
{
public:
CA(int a, int b, int c) {m_a = a;……
[/Quote]
jndxhdu 2012-06-15
  • 打赏
  • 举报
回复
写了个例子,确实是调用拷贝构造函数的。不过不是只有属于同一个类的两个对象可以相互赋值吗??[Quote=引用 10 楼 的回复:]

具体过程是这样的~

derived d(6,7,8);

base c=d;

这里的d 先转换成 base类,然后调用base的拷贝构造函数,因为你的base 没有定义Copy构造函数,就调用默认的,字节Copy。

这样定义你就能看明白真正的工作原理了。

class CA
{
public:
CA(int a, int b, int c) {m_a = a;……
[/Quote]
kevinyank 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
具体过程是这样的~

derived d(6,7,8);

base c=d;

这里的d 先转换成 base类,然后调用base的拷贝构造函数,因为你的base 没有定义Copy构造函数,就调用默认的,字节Copy。

这样定义你就能看明白真正的工作原理了。

class CA
{
public:
CA(int a, int b, int c) {m_a = a; ……
[/Quote]
正解。。顶~~~
showlie 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

那调用构造函数吗???引用 1 楼 的回复:
把子类对象切割成父类对象了
[/Quote]

确定是调用哪个构造函数,你只要看谁负责生成对象。这里就是继承类。

继承类是基类的扩展,他们都有自己的行为准则,继承类赋值给基类对象,你只要看当前的对象的类型和值,
类型是基类,那么它只有基类的行为准则,而值是继承类,也就是说它调用的是继承类中基类行为准则的那部分。
asyuae 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

那执行到语句 a=b时候,会调用构造函数吗??引用 5 楼 的回复:
#include<iostream>
using namespace std;
class A
{
public:
A(int a,int b,int c){cout<<"构造A类"<<endl;x=a;y=b;z=c;}
print(){cout<<x<<"\t"<<y<<"\t"<<z<<"\t";}
p……
[/Quote]
不会,调用复制构造
xiaohongna 2012-06-13
  • 打赏
  • 举报
回复
具体过程是这样的~

derived d(6,7,8);

base c=d;

这里的d 先转换成 base类,然后调用base的拷贝构造函数,因为你的base 没有定义Copy构造函数,就调用默认的,字节Copy。

这样定义你就能看明白真正的工作原理了。

class CA
{
public:
CA(int a, int b, int c) {m_a = a; m_b = b; m_c = c; std::cout << "Constructor CA\n";};
CA(const CA &a) { m_a = a.m_a; m_b = a.m_b; m_c = a.m_c; std::cout << "Copy Construcotr:CA\n";}
public:
int m_a;
int m_b;
int m_c;
};

class CB: public CA
{
public:
CB():CA(0, 1, 2){ std::cout << "Constructor CB\n";};
};
jndxhdu 2012-06-13
  • 打赏
  • 举报
回复
那执行到语句 a=b时候,会调用构造函数吗??[Quote=引用 5 楼 的回复:]
#include<iostream>
using namespace std;
class A
{
public:
A(int a,int b,int c){cout<<"构造A类"<<endl;x=a;y=b;z=c;}
print(){cout<<x<<"\t"<<y<<"\t"<<z<<"\t";}
private:
int x,y,z;
};
class B:publi……
[/Quote]
rainstamp1 2012-06-13
  • 打赏
  • 举报
回复
最后基类的三个参数的值都是4,5,6;
pathuang68 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

不能把派生类赋值给基类
[/Quote]

派生类赋给基类是可以滴,反过来则不行。
pathuang68 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

那调用构造函数吗???引用 1 楼 的回复:
把子类对象切割成父类对象了
[/Quote]

1楼说得很正确。那样会把派生类对象剪裁成派生类对象。就像将一个int值赋给short,也会发生剪裁一样。

构造函数肯定会调用的。
rainstamp1 2012-06-13
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
class A
{
public:
A(int a,int b,int c){cout<<"构造A类"<<endl;x=a;y=b;z=c;}
print(){cout<<x<<"\t"<<y<<"\t"<<z<<"\t";}
private:
int x,y,z;
};
class B:public A
{
public:
B(int a,int b,int c):A(a,b,c){cout<<"构造B类\n";}
};
int main()
{
B b(4,5,6);
A a(1,2,3);
a=b;
b.print();
a.print();
return 0;
}
确实可以的
rainstamp1 2012-06-13
  • 打赏
  • 举报
回复
不能把派生类赋值给基类
昵称很不好取 2012-06-13
  • 打赏
  • 举报
回复
自己写个例子试试
jndxhdu 2012-06-13
  • 打赏
  • 举报
回复
那调用构造函数吗???[Quote=引用 1 楼 的回复:]
把子类对象切割成父类对象了
[/Quote]
昵称很不好取 2012-06-13
  • 打赏
  • 举报
回复
把子类对象切割成父类对象了

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧