关于重写派生类的虚函数的访问控制问题,大家来帮帮忙!

sese53 2009-02-09 09:33:50
有时候看书的时候没有注意的一些问题,在做例子的时候暴露出来了,翻书居然没有!
1.比如基类有一个虚函数是protected的,如果子类要重写这个虚函数。在子类头文件中定义也只能定义在protected和privated里,还是可以定义在public里面呢?
2.以前好像看到一段话,现在找不到了,说的是虚函数这样的动态绑定是发生在程序运行的时候,而这个时候访问控制机制不再起作用,跟上面这个问题有关系么?
thanks
...全文
170 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ch1oE 2009-02-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sese53 的回复:]
第一点,你回答的是什么意思呢?
确实是运行时候多态,不是指模板的多态。
[/Quote]

第一点,就是说你可以把protected的提权成为public的,你可以试试看~
例如:



class parent
{
protected:
virtual void tell()
{
cout<<"don't tell anybody"<<endl;
}
};

class child : public parent
{
public:
void tell()
{
cout<<"i want to tell all"<<endl;
}
};

然后你可以类似这样调用

child tempChild;
child.tell();



可见,提权是有用的~
当然你也可以将public的降权为protected或者private的
例如:



class parent
{
public:
virtual void tell()
{
cout<<"don't tell anybody"<<endl;
}
};

class child : public parent
{
private:
void tell()
{
cout<<"i want to tell all"<<endl;
}
};

这样上面的那个代码就编译不过了,而且看起来确实没有办法调用tell了,是这样么?
child tempChild;

((parent*)(&tempChild))->tell(); //试试看~ same func as code below

//parent* pParent = &tempChild;
//pParent->tell();



换个思维:没有什么合适的方法来限制基类的public方法 -- 而且也确实没有理由那么做,不是么~
biosli 2009-02-09
  • 打赏
  • 举报
回复
楼上回答在理,一看就是实现了一下。建议楼主也以这种方式学习,不然只看书不动手是没用的。
有什么疑问自己先试试,就不用在这里问了。
hhyttppd 2009-02-09
  • 打赏
  • 举报
回复
所以访问控制肯定是由编译器处理的,不会在运行期判断,提升或降低访问控制的限制,只在编译期体现,需要运行期判断的,访问控制的规则不再有效。

如果已知内存布局,可以修改以下的私有成员变量m_i:


class Test
{
public:
Test(int i):m_i(i){}

void Show(){cout << m_i << endl;}
private:
int m_i;
};

void main()
{
Test t(100);

int *pi = reinterpret_cast<int*>(static_cast<void*>(&t));
*pi = 1;
t.Show();
}


hhyttppd 2009-02-09
  • 打赏
  • 举报
回复
所有的访问控制都是由编译器处理的,与运行期无关,这些public, protected,private一旦编译为二进制就不存在了。


#include <iostream>
using namespace std;

class Base
{
public:
virtual void CutDownRight()
{
cout << "void Base::CutDownPrivate()" << endl;
}

protected:
virtual void ExpandRight()
{
cout << "void Base::ExpandRight();" << endl;
}

};

class Derived : public Base
{
private:
virtual void CutDownRight()
{
cout << "void Derived::CutDownPrivate()" << endl;
}

public:
virtual void ExpandRight()
{
cout << "void Derived::ExpandRight();" << endl;
}

};

void main()
{
Derived* d = new Derived();
//d->CutDownRight(); //wrong
d->ExpandRight(); //ok

Base* bd = new Derived();
bd->CutDownRight(); //ok
//bd->ExpandRight(); //wrong
}

sese53 2009-02-09
  • 打赏
  • 举报
回复
第一点,你回答的是什么意思呢?
确实是运行时候多态,不是指模板的多态。
ch1oE 2009-02-09
  • 打赏
  • 举报
回复
(1) 可以提权,且保证有效。 也可以降权,但不保证有效。
(2) 是指运行期多态吧。
speeder53 2009-02-09
  • 打赏
  • 举报
回复
mk

65,210

社区成员

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

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