c 中的一个小问题

时间:2008-05-10 10:58:50   来源:论坛整理  作者:  编辑:chinaitzhe
我写了一个很简单的小程序,但是其中有几处不解之处,请高手指点:
#include <iostream.h>
class base
{
protected: //假如此处改成private将会是错误的,为什么??
int x;
public:
base(int a)
{
x=a;
}
void who()
{
cout < <"base" < <x < <endl;
}
};
class derive1:public base
{
public:
derive1(int a):base(a) //此处的构造函数是怎么赋值的???
{
}
void who()
{
cout < <"derive1" < <x < <endl;
}

};
class derive2:public base
{
public:
derive2(int a):base(a)
{

}
void who()
{
cout < <"derive2" < <x < <endl;
}
};
void main()
{
base *p;
base obj(1);
derive1 obj1(2);
derive2 obj2(3);
p=&obj;
p->who(); //为什么以下的三个输出都是输出base的成员函数???
p=&obj1;
p->who();
p=&obj2;
p->who();
}
网友回复:扔你了现在用的破教材吧,不要用它浪费生命了。
换《C Primer》第四版。
答案都在上面明明白白地写着呢。
网友回复:protected: //假如此处改成private将会是错误的,为什么??
假如是私有的,则子类不能访问变量x

derive1(int a):base(a) //此处的构造函数是怎么赋值的???
子类在构造时,先调用父类的构造函数

p->who(); //为什么以下的三个输出都是输出base的成员函数???
父类的who函数不是虚的
网友回复:类的private成员对于任何方式派生的派生类都是私有的,所以在derive*里访问x将变成非法,而protect则保证派生类对其具有权限
main里面p被声明为base类型,调用的自然是base的成员函数。C 规定基类指针可以指向派生类对象,但是仅能使用其基类里定义的成员(函数)。
假如要调用派生类成员,需要进行显示的类型转换。试试(derive1/2*)p->who()
网友回复:学习(初学)还是满认真的,能想到这些问题!我很同意上面某个人的观点,我开始就是看了些比较差的教材
把时间给浪费了,结果没学习到很多的东西,结果是努力了,还是没多大的长进!希望你看好一点的书,c primer 是很不错了,
我是随便翻了以下,基础讲解得很透彻!
网友回复:
引用 2 楼 ouyh12345 的回复:
protected: //假如此处改成private将会是错误的,为什么??
假如是私有的,则子类不能访问变量x

derive1(int a):base(a) //此处的构造函数是怎么赋值的???
子类在构造时,先调用父类的构造函数

p->who(); //为什么以下的三个输出都是输出base的成员函数???
父类的who函数不是虚的


class base
{
protected: //假如此处改成private将会是错误的,为什么??
int x;
public:
base(int a)
{
x=a;
}
virtual void who()
{
cout < < "base" < < x < <endl;
}
};

加上virtual后就可以得到你需要的结果了。。。
网友回复:C primer(第四版) 确实很适合初学者,当然你最好对C 有一定了解:)
而C primer(第三版)就讲的有些深了。。。章节编写的有些乱。。。初学者会看晕的:)
以上是我学习的一些经验:)
网友回复:确实应该好好看看教材
网友回复:来晚了...
网友回复:
引用 5 楼 wrinky 的回复:
引用 2 楼 ouyh12345 的回复:
protected: //假如此处改成private将会是错误的,为什么??
假如是私有的,则子类不能访问变量x

derive1(int a):base(a) //此处的构造函数是怎么赋值的???
子类在构造时,先调用父类的构造函数

p->who(); //为什么以下的三个输出都是输出base的成员函数???
父类的who函数不是虚的


class base
{
protected: //假如此处改…



此兄已说得很具体了,慢慢学吧。
网友回复:c 相对于 C 的新特性 包括: 重载(overload)、viture、const、inline希望楼主仔细看看。
其中 重载 覆盖 virture之间的关系也是很重要的。
网友回复:protected: //假如此处改成private将会是错误的,为什么??
会问出这样的问题那说明你没有把私有,保护和公有三者没有弄的清楚.
私有:只能在类中使用.
保护:除了能在本类中使用以外,其继续类中也可以调用.
公有:哪里都能用.

derive1(int a):base(a) //此处的构造函数是怎么赋值的???
这个构造函数是默认的值.

//为什么以下的三个输出都是输出base的成员函数???
因为两个继续都是默认的值,在你看以下每个WHO求的值是什么.
网友回复:en!
网友回复:1)派生类只能访问public 和 protected成员
2)派生类构造的时候先构造基类
3)who函数不是virtual的,不具有多态
关键字:一个,问题,
上一篇:求助,VS2005问题

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面