父类的构造函数中调用子类的函数

haow85 2010-09-26 04:59:30
To understand this behavior, consider what would happen if the derived-class version of a virtual function were called from a base-class constructor (or destructor).

什么情况下才会出现父类的构造函数调用子类的函数的情况?
...全文
314 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
haow85 2010-10-10
  • 打赏
  • 举报
回复
这种情况其实是存在的,就是传说中的 CRTP。昨天刚看了书。
herman~~ 2010-09-27
  • 打赏
  • 举报
回复
孩子都没出生来,就想逗孩子玩
emptyness 2010-09-27
  • 打赏
  • 举报
回复
试验证明, 确实不存在这种情况.
在构造函数调用的时候 子类的虚函数貌似不会被使用.所以这样也就根本不存在楼主说的问题了.
父类构造函数中,编译器压根不会调用子类的虚函数.
emptyness 2010-09-27
  • 打赏
  • 举报
回复
我认为存在这种情况. 当然函数必须是虚函数. 我认同10楼的看法.
具体的还要试验下.毕竟是个古怪的做法,编译器和标准, 我想也没人精通每一个细节.试试就知道了.
等我试验下先.
binbin1129 2010-09-26
  • 打赏
  • 举报
回复
貌似没有这种情况。。。。
只有父类的指针指向子类的对象时能调用子类的函数,而且函数必须在父类里是虚的
dingshaofengbinbin 2010-09-26
  • 打赏
  • 举报
回复
应该不可能吧,父类构造的时候子类还没有构造。。。
lovestefanie 2010-09-26
  • 打赏
  • 举报
回复
多态么?
BillLeecn 2010-09-26
  • 打赏
  • 举报
回复
等到伊拉克打败了美国再来考虑这个问题
arong1234 2010-09-26
  • 打赏
  • 举报
回复
如果能运行就是运行错,但是现在编译器一般很聪明,在编译期就给你错误,禁止你这么用。
[Quote=引用 13 楼 mrrat521 的回复:]
引用 6 楼 xunmengren2009 的回复:
To understand this behavior, consider what would happen if the derived-class version of a virtual function were called from a base-class constructor (or destructor).

为了理……
[/Quote]
haow85 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pengzhixi 的回复:]
引用 15 楼 haow85 的回复:
引用 14 楼 fengxuxing 的回复:

构造函数调用是程序自动进行的,你根本干涉不到。父类有时候需要用到子类传递过来的参数,所以让子类先初始化,然后再让父类初始化。
这个逻辑是唯一的。如果能让父类调用子类的初始化函数,则乱套了

能说说什么情况下父类需要子类传递过来的参数么?


你为什么就不能把书完整的看完呢?


C/C……
[/Quote]
这样还是父类先初始化,子类后初始化。
cheng_fengming 2010-09-26
  • 打赏
  • 举报
回复
构造函数不能是虚函数,而析构函数可以而且通常是虚函数。
liutengfeigo 2010-09-26
  • 打赏
  • 举报
回复
中~是不能的
fantasy_chl 2010-09-26
  • 打赏
  • 举报
回复
没有这种情况
pengzhixi 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 haow85 的回复:]
引用 14 楼 fengxuxing 的回复:

构造函数调用是程序自动进行的,你根本干涉不到。父类有时候需要用到子类传递过来的参数,所以让子类先初始化,然后再让父类初始化。
这个逻辑是唯一的。如果能让父类调用子类的初始化函数,则乱套了

能说说什么情况下父类需要子类传递过来的参数么?
[/Quote]

你为什么就不能把书完整的看完呢?

struct Base{
int m_;
Base(int i):m_(i){ }
};

struct Drived:public Base {
Drived(int j):Base(j){}
};

int main()
{
Drived obj(4);

system("pause");
return 0;
}


haow85 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fengxuxing 的回复:]

构造函数调用是程序自动进行的,你根本干涉不到。父类有时候需要用到子类传递过来的参数,所以让子类先初始化,然后再让父类初始化。
这个逻辑是唯一的。如果能让父类调用子类的初始化函数,则乱套了
[/Quote]
能说说什么情况下父类需要子类传递过来的参数么?
Qlaiaqu 2010-09-26
  • 打赏
  • 举报
回复
构造函数调用是程序自动进行的,你根本干涉不到。父类有时候需要用到子类传递过来的参数,所以让子类先初始化,然后再让父类初始化。
这个逻辑是唯一的。如果能让父类调用子类的初始化函数,则乱套了
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xunmengren2009 的回复:]
To understand this behavior, consider what would happen if the derived-class version of a virtual function were called from a base-class constructor (or destructor).

为了理解这种行为,
我们要注意,当基类的构造函数(析构函数)……
[/Quote]

那如果当基类的构造函数(析构函数)调用了派生类的虚函数时,会发生生什么情况了??
如果报错~~
请问是编译错、
还是运行错???
  • 打赏
  • 举报
回复
不存在这种情况
llllllllllllleon 2010-09-26
  • 打赏
  • 举报
回复
不要在构造函数和析构函数中调用虚函数。
因为基类构造函数在子类之前执行,当基类的构造函数执行时,子类的数据成员没有被初始化。
如果虚函数在基类构造的时候调用,而进入到子类中的时候,子类的函数需要访问到本地数据,但是这些数据成员还没有被初始化,调用一个没有被初始化的东东是很危险滴。
refer to参见网页
haow85 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]

比如在基类里面调用一个虚函数,那么你在构造一个派生类对象的时候在基类调用的这个虚函数不是派生类里面的版本,而是基类里面的版本。
C/C++ code
struct Base{
Base(){ fun();}
virtual void fun(){cout < <"Base version" < <endl;}
};
……
[/Quote]
这样的坏处是什么?
加载更多回复(8)

64,651

社区成员

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

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