继承问题?先答对的给分,不难。

liquanle 2003-12-01 10:27:19
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的存储类别,第二种,我感觉是不是重新定义了一下,书上没有讲这个。我就不知道了,希望有人能告诉我……

...全文
21 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cullstar 2003-12-03
  • 打赏
  • 举报
回复
有希望交流的可以QQ我
QQ24160879

:public公有继承
派生类的成员函数可以访问基类中的protected和public域,但派生类的对象(派生类对象不用我说了吧)只能访问基类的public

:protected保护继承和:priate私有继承
派生类的成员函数可以访问基类中的protected和public域,但派生类的对象(派生类对象不用我说了吧)不能访问基类任何对象

:protected保护继承模式难以捉摸一般很少使用!!
cullstar 2003-12-03
  • 打赏
  • 举报
回复

第一种编译错误,原因:派生类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();
}

我觉得你有必要看看关于继承模式的书

yuanetking 2003-12-03
  • 打赏
  • 举报
回复
好奇怪的代码,你书的作者,肯定在昏迷状态写下的书,建议,换书!!
yuanetking 2003-12-03
  • 打赏
  • 举报
回复
你第一个是错误的A::ai
dsao 2003-12-03
  • 打赏
  • 举报
回复
computer386(流星雨); 同意你的看法。
不过这里没有出现virtual关键字。是不是应该没有vptr呀?
进来讨论一下。
Meyer 2003-12-03
  • 打赏
  • 举报
回复
virtual int ai ???
恕我寡闻
一路奔跑 2003-12-03
  • 打赏
  • 举报
回复
楼上说的也有可能~~~
<<深度探索C++对象模型>> 54,穷啊~~
panxiongfei 2003-12-03
  • 打赏
  • 举报
回复
同意:
第一种方式编译通不过吧??

第二种方式从调用方来讲,B::ai把A::ai覆盖了,但其实B的对象中含有两个ai,一个是A的ai,另一个是自己的,只是A::ai永远不会被调用到罢了。除非你在B类的内部函数使用作用域界定符“::”
楼住的意思可能是,能不能改变继承下来的副类的成员的private 属性。
回答是不可能。
echolx 2003-12-03
  • 打赏
  • 举报
回复
但是computer386(流星雨)你已经说得很明白了,很多人都认为B::a1会覆盖A::a1呢!
computer386 2003-12-03
  • 打赏
  • 举报
回复
TO dsao(神农) 昨天搞错了没有VPTR
应改为关于类信息的一个Slot!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
还有排列次序与编译器有关。不好意思啊!!!!!!!!!!!!!!!!!!!!!!!!!
无人子弟。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
computer386 2003-12-02
  • 打赏
  • 举报
回复
还忘说了在B中,正常情况他没有权限去访问A的成员.除非采用别的办法.但A的成员在B中是存在的!!!!!!!!!!!!!没有覆盖!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
computer386 2003-12-02
  • 打赏
  • 举报
回复
第一种方式编译通不过
第二种:
请看CLASS B的内存布局:
______
|B::bi|
|_____|
|B::ai|
|_____|
|A::ai|
|_____|
|vptr |
|_____|
不存在覆盖.他们是分配不同的内存!!!!!!!!!!!!!!!!!!
请参考<<深度探索C++对象模型>>
RedFoxC 2003-12-02
  • 打赏
  • 举报
回复
这两个都通不过编译!!!!!!!
一路奔跑 2003-12-02
  • 打赏
  • 举报
回复
第一个错误,第二个覆盖。
lovezn0424 2003-12-02
  • 打赏
  • 举报
回复
第一个通不过因为他什么也不是。

第二个前面的说得不错了。
xhc_2000 2003-12-01
  • 打赏
  • 举报
回复
第一个通不过吧?谁懂怎么回事?
liquanle 2003-12-01
  • 打赏
  • 举报
回复
fireseed(奶油狗【一打开BCB,就象在蹲茅坑!】) () 信誉:105
你说的对,第一种根本就不能通过编译。
zhuang1415 2003-12-01
  • 打赏
  • 举报
回复
第一种是什么意思?
第二种是覆盖了A类的ai;如果想继承的话要用virtual int ai 在A类中定义ai了
liquanle 2003-12-01
  • 打赏
  • 举报
回复
第一种是书上原代码,第二种是我自己加的。
heguobaoceo 2003-12-01
  • 打赏
  • 举报
回复
被覆盖了,
其实你可以用virtual int ai 去定义咯
加载更多回复(2)

64,662

社区成员

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

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