继承问题?先答对的给分,不难。
class A{
int ai;
};
class B: public A{
int bi
public:
A::ai; //第一句
};
**************************************************************
class A{
int ai;
};
class B: public A{
int bi
public:
int ai; //第二句
};
上下两种用法,有没有区别,还是根本就不是一个东西,第一种是改变了基类ai的存储类别,第二种,我感觉是不是重新定义了一下,书上没有讲这个。我就不知道了,希望有人能告诉我……
问题点数:30、回复次数:22Top
1 楼kdush(迷茫过后……还是迷茫……) (love—>kula始终未变)回复于 2003-12-01 22:33:03 得分 0
我认为没有区别,都是把A.ai 的值覆盖掉了.Top
2 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2003-12-01 22:37:52 得分 10
第一种方式编译通不过吧??
第二种方式从调用方来讲,B::ai把A::ai覆盖了,但其实B的对象中含有两个ai,一个是A的ai,另一个是自己的,只是A::ai永远不会被调用到罢了。除非你在B类的内部函数使用作用域界定符“::”Top
3 楼heguobaoceo(awen)回复于 2003-12-01 22:38:39 得分 0
被覆盖了,
其实你可以用virtual int ai 去定义咯
Top
4 楼liquanle()回复于 2003-12-01 22:58:40 得分 0
第一种是书上原代码,第二种是我自己加的。Top
5 楼zhuang1415(吉力)回复于 2003-12-01 23:01:23 得分 0
第一种是什么意思?
第二种是覆盖了A类的ai;如果想继承的话要用virtual int ai 在A类中定义ai了Top
6 楼liquanle()回复于 2003-12-01 23:30:32 得分 0
fireseed(奶油狗【一打开BCB,就象在蹲茅坑!】) () 信誉:105
你说的对,第一种根本就不能通过编译。Top
7 楼xhc_2000(大雪)回复于 2003-12-01 23:42:14 得分 1
第一个通不过吧?谁懂怎么回事?Top
8 楼lovezn0424(宁无悔program)回复于 2003-12-02 15:52:34 得分 1
第一个通不过因为他什么也不是。
第二个前面的说得不错了。Top
9 楼renfengxing(任风行)回复于 2003-12-02 16:15:17 得分 1
第一个错误,第二个覆盖。Top
10 楼RedFoxC(赤狐)回复于 2003-12-02 16:20:37 得分 0
这两个都通不过编译!!!!!!!Top
11 楼computer386(流星雨)回复于 2003-12-02 16:36:39 得分 3
第一种方式编译通不过
第二种:
请看CLASS B的内存布局:
______
|B::bi|
|_____|
|B::ai|
|_____|
|A::ai|
|_____|
|vptr |
|_____|
不存在覆盖.他们是分配不同的内存!!!!!!!!!!!!!!!!!!
请参考<<深度探索C++对象模型>>Top
12 楼computer386(流星雨)回复于 2003-12-02 16:40:04 得分 0
还忘说了在B中,正常情况他没有权限去访问A的成员.除非采用别的办法.但A的成员在B中是存在的!!!!!!!!!!!!!没有覆盖!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Top
13 楼renfengxing(任风行)回复于 2003-12-03 09:00:42 得分 0
楼上说的也有可能~~~
<<深度探索C++对象模型>> 54,穷啊~~Top
14 楼Meyer(断水)回复于 2003-12-03 09:21:27 得分 0
virtual int ai ???
恕我寡闻Top
15 楼dsao(神农)回复于 2003-12-03 09:36:59 得分 0
computer386(流星雨); 同意你的看法。
不过这里没有出现virtual关键字。是不是应该没有vptr呀?
进来讨论一下。Top
16 楼yuanetking(初远)回复于 2003-12-03 09:55:38 得分 0
你第一个是错误的A::aiTop
17 楼yuanetking(初远)回复于 2003-12-03 09:56:51 得分 0
好奇怪的代码,你书的作者,肯定在昏迷状态写下的书,建议,换书!!Top
18 楼cullstar(我踏月色而来╰☆╮)回复于 2003-12-03 10:44:22 得分 10
第一种编译错误,原因:派生类B企图调用基类A的私有数据成员,这样是坚决不允许的,不管是公用继承(public)还是其它两种(private、protected),当然后两种继承方法 能访问基类的权限更小。
第二种是在派生类B中再定义个整型量ai,和基类A中的同名变量是两回事。如果想访问基类中的同名变量(在继承方法和变量声明的域 都是有严格要求的),假设同名变量定义在基类的protected保护中,那么利用:public公有继承后,派生类B便可以通过成员函数来访问它,但类B的对象是不能访问的。
如:
#include <iostream.h>
#include <conio.h>
class A{
protected:
int ai;
public:
A(){ai=10;}
};
class B:public A{
int bi;
int ai;
public:
B(){ai=20;}
void showDate();
};
void B::showDate()
{
cout <<A::ai<<endl;
cout <<ai;
}
void main()
{
B b;
b.showDate();
getch();
}
我觉得你有必要看看关于继承模式的书
Top
19 楼cullstar(我踏月色而来╰☆╮)回复于 2003-12-03 10:58:30 得分 1
有希望交流的可以QQ我
QQ24160879
:public公有继承
派生类的成员函数可以访问基类中的protected和public域,但派生类的对象(派生类对象不用我说了吧)只能访问基类的public
:protected保护继承和:priate私有继承
派生类的成员函数可以访问基类中的protected和public域,但派生类的对象(派生类对象不用我说了吧)不能访问基类任何对象
:protected保护继承模式难以捉摸一般很少使用!!Top
20 楼computer386(流星雨)回复于 2003-12-03 16:06:19 得分 1
TO dsao(神农) 昨天搞错了没有VPTR
应改为关于类信息的一个Slot!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
还有排列次序与编译器有关。不好意思啊!!!!!!!!!!!!!!!!!!!!!!!!!
无人子弟。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Top
21 楼echolx(火凝风)回复于 2003-12-03 16:13:46 得分 1
但是computer386(流星雨)你已经说得很明白了,很多人都认为B::a1会覆盖A::a1呢!Top
22 楼panxiongfei(飞)回复于 2003-12-03 16:17:30 得分 1
同意:
第一种方式编译通不过吧??
第二种方式从调用方来讲,B::ai把A::ai覆盖了,但其实B的对象中含有两个ai,一个是A的ai,另一个是自己的,只是A::ai永远不会被调用到罢了。除非你在B类的内部函数使用作用域界定符“::”
楼住的意思可能是,能不能改变继承下来的副类的成员的private 属性。
回答是不可能。Top




