初始化列表中基类构造函数调用派生类函数

M7Heaven 2013-11-08 12:10:39
#include <iostream>

using std::cout;
using std::endl;

class Base
{
public:
Base(int para)
{
a = para;
cout << "Base::a = " << a << endl;
}
private:
int a;
};

class Derive : public Base
{
public:
int foo()
{
cout << "Derived::foo() return 0" << endl;
return 0;
}
Derive() : Base(foo()) {}
};

class Derive2 : public Base
{
public:
int foo()
{
cout << "Derive2::foo() return " << a << endl;
return a;
}
Derive2() : a(0), Base(foo()) {}
private:
int a;
};

int main(void)
{
Derive cld;
Derive2 cld2;
//Base *bptr = new Derive;
//bptr->foo(); //error: Base has no member named foo


return 0;
}


问题:
g++编译器进行编译没有报错,能执行
为什么Base能调用派生类定义的函数foo()进行初始化,base初始化的时候
派生类部分不是还不存在吗,怎么能调用foo(),而且foo()中还有派生类中才声明的变量a

请各位解释解释~
...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjfdqchwhj 2013-11-11
  • 打赏
  • 举报
回复
我看了一下楼主的代码: 首先,你这根本就不是“基类构造函数调用派生类函数” 其次,光看代码,没看出有什么会出错的地方
todd_leftcode 2013-11-10
  • 打赏
  • 举报
回复
这叫个啥“基类构造函数调用派生类函数”? 这根本就是在派生类构造函数里嘛! 当构造一个类实例时, 调用这个类的构造函数,这个构造函数首先调用基类的构造函数。楼主的代码中,派生类构造函数在调用基类构造函数时传了个参数给基类构造函数,而传的这个参数是调用foo函数的结果(这里是派生类构造函数调用foo,而不是基类构造函数,基类都不知道foo是个啥玩),而foo函数不访问this,也就无所谓“派生类部分不是还不存”的问题了。 当然这个代码这样写确实不好看,foo确实应该写成一个静态函数。另外Drive2的初始化列表中应该先写Base再写a, 这个在一些新版本的编译器中会有警告。
lm_whales 2013-11-10
  • 打赏
  • 举报
回复
这又不是虚函数,而且也没有使用成员变量,编译通过也属于正常。 但是,这种代码,如果需要修改就麻烦了。 修改后的代码; 可能会引用成员变量; 但是父类,会首先初始化。 这时成员变量,还没有初始化。 这就成问题了。 也许下一个标准,这种就是错误了。 未定义行为,编译器不一定,都去检查。
truth34 2013-11-10
  • 打赏
  • 举报
回复
理论上是行为未定义的,但是可能由于 foo() 中,没有引用当前类的成员的原因,所以编译器实现上不会有错。 如果现实项目中有这种需求,foo()可定义成static。
云斜月 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 dyw 的回复:
运行结果也正确?你糊弄编译器,编译器也会糊弄你。
楼上正解,编译可以通过,不太表就是正确的,比如返回一个局部变量的地址。
SKATE11 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 dyw 的回复:
运行结果也正确?你糊弄编译器,编译器也会糊弄你。
++
dyw 2013-11-08
  • 打赏
  • 举报
回复
运行结果也正确?你糊弄编译器,编译器也会糊弄你。
mujiok2003 2013-11-08
  • 打赏
  • 举报
回复
怪异的行为,
引用
派生类部分不是还不存在吗,怎么能调用foo(),而且foo()中还有派生类中才声明的变量a
行为未定义
taodm 2013-11-08
  • 打赏
  • 举报
回复
能执行就是正确么?
nightkids_008 2013-11-08
  • 打赏
  • 举报
回复
c++对象模型里 第几章忘了 你可以去看看有写关于这个的 lippman会告诉你为什么
M7Heaven 2013-11-08
  • 打赏
  • 举报
回复
我也不认为是正确的,本来以为编译会报错,但是却通过了 我的问题是为什么base的构造函数能够以derive中定义的函数的返回值作为参数 这是高不明白的地方

64,642

社区成员

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

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