派生类中调用父类构造函数为什么不能赋值?

jiuyu 2017-11-06 10:03:07
#include <iostream>
using namespace std;

class A {
public:
A() {};
A ( int i , int j ): x(i), y(j) {};
public:
void modify (int i, int j) { x= i; y = j;};
virtual void show() {};

protected:
int x;
int y;
} ;

class B :public A {

public:
B ( int i, int j) : A(i,j ) { // 调用A(i, j),给B中的x,y 赋值

modify ( i * 2, j * 2); // 可以成功修改
A ( i * 3, j *3 ); // 无效 就是这里没有理解,请高手指点
}

public:
void show() { cout << x << endl << y << endl;};

protected:
int z;
};

int main() {
A* pa = new B(2,5);
pa->show(); // 4, 10

return 0;
}
...全文
267 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2017-11-09
  • 打赏
  • 举报
回复
引用 8 楼 jiuyu 的回复:
引用 7 楼 paschen 的回复:
A(i * 3, j * 3) 并不是赋值本对象的基类部分,而是构造一个全新的临时对象A,之后根着就销毁了
如此鸡肋的功能,为什么不禁止掉? 使用临时对象的方法,或者临时对象new了内存并带回,感觉没用.
这是语法的完整性,而不是语法本身的问题,正如这样一条语句也是合法的: 3;
jiuyu 2017-11-08
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
A(i * 3, j * 3) 并不是赋值本对象的基类部分,而是构造一个全新的临时对象A,之后根着就销毁了
如此鸡肋的功能,为什么不禁止掉? 使用临时对象的方法,或者临时对象new了内存并带回,感觉没用.
  • 打赏
  • 举报
回复
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
paschen 版主 2017-11-07
  • 打赏
  • 举报
回复
A(i * 3, j * 3) 并不是赋值本对象的基类部分,而是构造一个全新的临时对象A,之后根着就销毁了
destory27 2017-11-07
  • 打赏
  • 举报
回复
创建一个空类,其中含有6个函数 构造函数 是在创建对象时自动调用的
FoolCarpe 2017-11-07
  • 打赏
  • 举报
回复
不在初始化列表上时,“A ( i * 3, j *3 );” 生成一个无名的A对象
sdghchj 2017-11-07
  • 打赏
  • 举报
回复
基本构造只能在初始化列表 上调用。 在构造函数体内那样调用是创建了一个新的临时对象。
sfl001 2017-11-06
  • 打赏
  • 举报
回复
构造函数是在创建对象的时候被动的调用的,不是随便就直接可以调用的,所以A()就会错,你把那个调用改成创建对象就不会错了。
sfl001 2017-11-06
  • 打赏
  • 举报
回复
在派生类中不能直接调用构造函数的,而且派生类的初始化列表是给父类的构造函数赋值,不是父类给子类赋值,而且构造函数是在创建对象的时候才会执行吧,楼主对类的基础知识还不是很了解啊。

64,651

社区成员

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

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