s*******1 发帖数: 20 | 1 why the following won't compile? Thanks a lot.
error: class ‘Derived’ does not have any field named ‘_datum’
#include
using namespace std;
class Base{
public:
Base():_datum(0.0){};
double datum(){return _datum;}
protected:
double _datum;
};
class Derived:public Base{
public:
Derived():_datum(1.0){};
};
int main()
{
Derived a;
cout << a.datum() << endl;
return 0;
} |
r*********r 发帖数: 3195 | 2 可以放在 initialization list 里的有两种: immediate base classes,
和 members not inherited from a base class. |
z****e 发帖数: 2024 | 3 除了死记硬背,lz可以这样理解这个问题,
在进入constructor的left openning brace { 之前,所有的subobjects 必须被
initilaized。包括基类和所有成员。不论你使用不使用初始化表符。
如果你不使用初始化表符,在进入{ 之前,编译器调用默认的基类构造函数。如果你使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。
好,这就说明,初始化基类的成员,在进入 { 之前,只能通过编译器调用默认的基类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入基类的{ 之前,基类的所有成员,也要被初始化。
所以,Base::_datum,是在进入Base的构造函数的{ 之前被初始化的,而不是你这个派生类的{ 之前。
这个同时也解释了,为什么初始化表符都是比构造函数赋值更高效,因为进入构造函数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋值了。 |
r*********r 发帖数: 3195 | 4 解释不用这么罗唆吧. 实际上就是 一个类的 data member 有两种,
一种是继承来的, 一种是在此类中新定义的.
继承来的就要交给对应的基类去初始化. |
z****e 发帖数: 2024 | 5 我是在解释为什么
“继承来的就要交给对应的基类去初始化”
【在 r*********r 的大作中提到】 : 解释不用这么罗唆吧. 实际上就是 一个类的 data member 有两种, : 一种是继承来的, 一种是在此类中新定义的. : 继承来的就要交给对应的基类去初始化.
|
t****t 发帖数: 6806 | 6 解释得不错, 我想你现在应该认识到, 需要死记硬背的东西确实很少.
使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。
类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入
基类的{ 之前,基类的所有成员,也要被初始化。
个派生类的{ 之前。
数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋
值了。
【在 z****e 的大作中提到】 : 除了死记硬背,lz可以这样理解这个问题, : 在进入constructor的left openning brace { 之前,所有的subobjects 必须被 : initilaized。包括基类和所有成员。不论你使用不使用初始化表符。 : 如果你不使用初始化表符,在进入{ 之前,编译器调用默认的基类构造函数。如果你使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。 : 好,这就说明,初始化基类的成员,在进入 { 之前,只能通过编译器调用默认的基类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入基类的{ 之前,基类的所有成员,也要被初始化。 : 所以,Base::_datum,是在进入Base的构造函数的{ 之前被初始化的,而不是你这个派生类的{ 之前。 : 这个同时也解释了,为什么初始化表符都是比构造函数赋值更高效,因为进入构造函数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋值了。
|
z****e 发帖数: 2024 | 7 关键是有大侠的伟岸身影,时刻督促我前进。
我只是一个在海边捡贝壳的小孩子,
如果说我解释的不错,
也只是因为站在了巨人的肩膀上。
【在 t****t 的大作中提到】 : 解释得不错, 我想你现在应该认识到, 需要死记硬背的东西确实很少. : : 使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。 : 类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入 : 基类的{ 之前,基类的所有成员,也要被初始化。 : 个派生类的{ 之前。 : 数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋 : 值了。
|
l******e 发帖数: 12192 | 8 人才
【在 z****e 的大作中提到】 : 关键是有大侠的伟岸身影,时刻督促我前进。 : 我只是一个在海边捡贝壳的小孩子, : 如果说我解释的不错, : 也只是因为站在了巨人的肩膀上。
|
r*********r 发帖数: 3195 | 9 ditto
【在 l******e 的大作中提到】 : 人才
|
t****t 发帖数: 6806 | 10 确实是人才, 雷得我说不出话来.
【在 l******e 的大作中提到】 : 人才
|
|
|
r*********r 发帖数: 3195 | 11 抱粗腿抱得还蛮准的,以后c++的问题都有解了。 |
z****e 发帖数: 2024 | 12 抱粗腿?我念粗腿都费劲,不信你试试:
山前住的叫崔粗腿,山后住的叫崔腿粗,
两人山前来比腿,
也不知是崔粗腿比崔腿粗的粗腿,
还是那崔腿粗比崔粗腿的腿粗。
【在 r*********r 的大作中提到】 : 抱粗腿抱得还蛮准的,以后c++的问题都有解了。
|
B*******g 发帖数: 1593 | 13 >_< 不做公关或销售可惜了
【在 z****e 的大作中提到】 : 关键是有大侠的伟岸身影,时刻督促我前进。 : 我只是一个在海边捡贝壳的小孩子, : 如果说我解释的不错, : 也只是因为站在了巨人的肩膀上。
|
s*******e 发帖数: 664 | 14 我觉得zaoxie的话还是蛮真诚的,知遇感恩之情尽在其中呢
【在 B*******g 的大作中提到】 : >_< 不做公关或销售可惜了
|
c********e 发帖数: 42175 | 15 嗯,第一句就说了5遍才顺溜。
【在 z****e 的大作中提到】 : 抱粗腿?我念粗腿都费劲,不信你试试: : 山前住的叫崔粗腿,山后住的叫崔腿粗, : 两人山前来比腿, : 也不知是崔粗腿比崔腿粗的粗腿, : 还是那崔腿粗比崔粗腿的腿粗。
|