重载基类函数的问题

csdn_tw 2005-12-29 10:34:22
有没有办法在派生类中重载基类中声明的一个方法,该方法在基类的protected中声明,但不是虚函数
...全文
190 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_tw 2005-12-30
  • 打赏
  • 举报
回复
这么多热心人,谢谢大家.

对,应该是覆盖,不能叫重载,实际上我用的是DELPHI的VCL类库中的一个控件类作为基类,派生出我自己的控件类,而且在派生类中已经声明了同名函数,而且参数类型和位置都与基类一样,但跟踪调试发现,代码还是运行基类中的函数代码,所以才想起请教大家,看看是什么问题,谁还能帮忙分析一下?
sankt 2005-12-29
  • 打赏
  • 举报
回复
有没有办法在派生类中重载基类中声明的一个方法,该方法在基类的protected中声明,但不是虚函数
//=============
一、覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual关键字。
二、"隐藏"是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
ericqxg007 2005-12-29
  • 打赏
  • 举报
回复
恩 同意sanhill() 的说法 这正是所说的覆盖 不是重载
sanhill 2005-12-29
  • 打赏
  • 举报
回复
自己重新在派生类中改写一遍那个成员函数就好了,派生类的成员函数会覆盖父类的非虚同名函数的,正好达到你要的效果嘛
csdn_tw 2005-12-29
  • 打赏
  • 举报
回复
忘说一句,这个方法在基类中被基类的私有函数调用,我想把这个方法在派生类中重新实现,使派生类的实例在运行时执行我写的代码
cunsh 2005-12-29
  • 打赏
  • 举报
回复
class A{
protected:
void func(){}
};

class B: public A{
protected:
A::func; ///////

再写你要重载的func.

SuperXu_swjtu 2005-12-29
  • 打赏
  • 举报
回复
上面例子里面:
基类的私有函数vcallProtected()调用了保护函数vgetValue(),然后在构造函数中又调用了私有函数vcallProtected()输出值;
而派生类重写了vgetValue()函数,在构造函数中调用,我觉得应该实现了你说的要求了。
SuperXu_swjtu 2005-12-29
  • 打赏
  • 举报
回复
#include<iostream>
#include<string.h>
using namespace std;

class Base{
public:
Base(const int b);
~Base()
{
cout << "~Base()" << endl;
}
protected:
int getValue()
{
return bValue;
}
private:
int bValue;
void callProtected()
{
cout << "call Protected function: " << getValue() << endl;
}
};

Base::Base(const int b = 0) :bValue(b)
{
cout << "Base()" << endl;
callProtected();
}

class Derived : public Base{
public:
Derived(const int d);
~Derived()
{
cout << "~Derived()" << endl;
}
int getValue()
{
cout << "Derived getValue()" << endl;
return 10;
}
private:
int di;
};
Derived::Derived(const int d) : Base(3), di(d)
{
cout << "Derived()" << endl;
cout << getValue() << endl;
}
int main()
{
Base b(2);
cout << endl;
cout << endl;
Derived d(3);


return 0 ;
}
好像实现了你说的要求,但是可以看出基类中的getValue()已经被隐藏了!
snowred_bai 2005-12-29
  • 打赏
  • 举报
回复
不能用virtual关键字的话,那只有用静态连编了。
可以定义派生类的函数与基类的函数同名,并且参数也相同,这样的话,可以满足你的要求。

64,637

社区成员

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

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