如何让一个成员不能在派生类中重新定义

xunknown 2002-10-08 11:06:17
#include <iostream.h>
////
class A
{
////如何让a和f不能再在派生类中重新定义呢?
public:
int a;
void f(){};
};
class B:public A
{
////在派生类重新定义了a和f。如何让a和f不能再在派生类中重新定义呢?
public:
int a;
void f(){};
};

void main()
{
class A a;a;
B b;b;
a.a=1;
a.f();
b.a=2;
b.f();
}
...全文
43 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
blue_coco 2002-10-08
  • 打赏
  • 举报
回复
赞同!
B 是 A 的派生类

B b;
A *pa = (A*)&b;
通过pa 来访问成员函数很成员变量
就避免了B中 对A中同名函数和变量的覆盖(除声明为virtual的)。



eastxing 2002-10-08
  • 打赏
  • 举报
回复
没有可能!
不知道你为什么要求这样?
你这里的“重新定义”是什么意思?仅仅是指不能再用在基类中使用过的名字吗?
在你的例子中,派生类中的data member a和基类中的data member a虽然名字相同,但实际上是不同的。一个class B的对象的内存布局如下:
int A::a
int B::a
因为名字相同,所以通过 class B对象.a 的方式只能访问到B::a。
但如下方式应该是可以访问到A::a的:
B b;
A *pa = dynamic_cast<A*>&b;
pa->a = 5; // 这里访问的是A::a

至于函数情况差不多。若你想在类中函数在派生类中实现,请声明为virtual的;否则,一定不要在派生类中重写基类中非virtual的函数。
xunknown 2002-10-08
  • 打赏
  • 举报
回复
private没有用的!
对于继承来说,如果把构造函数声明为private到是有点用处,把析构函数声名为protected也有用-就是不能有派生类了。
xunknown 2002-10-08
  • 打赏
  • 举报
回复
我希望是用一个关键字来说明。有吗?
用户 昵称 2002-10-08
  • 打赏
  • 举报
回复
private
xunknown 2002-10-08
  • 打赏
  • 举报
回复
这样做的目的是:如果可以这样做,我们就可以有一个很简单的方法,在运行时确定类型信息,只要是判断对象的类型,以及这个类的父类和根类(对于单继承),而且不会出错。(当然,现在已经有获取运行时类型信息的方法,例如mfc的,还有c++自身的,但你认为那是一个最好的方法了吗?)
例如:
class A
{
private:
static unsigned int id;
public:
static unsigned int GetID()const{return id;}
};
我希望所有A是派生类(及其对象)都可以通过调用GetID()得到根类(或者父类或者本类)信息。
但是我们要保证函数GetID()不能被重写,否则我们得不到正确的信息!例如
class B:public A
{
private:
static unsigned int id;
public:
static unsigned int GetID()const{return id;}
};
unsigned int A::id='a';
unsigned int B::id='b';
void main()
{
unsigned int i,j;
A a;a;
B b;b;
i=a.GetID();
j=b.GetID();
}
肯定得不到我们要的结果。我们期望i,j的值都是'a'。
但如果能够保证id和GetID()在B类中没有重新定义,就是说在一个派生树中,虽然名字空间不同,但是一个名字在不同的名字空间也只能出现一次,虽然出现多次不会发生名字冲突。而且,发挥想象力,如果有这种保证,也许我们能够做许多有意义的也很必要也很重要的事,而且实现起来很容易。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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