关于派生类调用基类同名函数的问题

Mr_Ldh 2004-12-24 10:52:40
代码如下:
class Base
{
virtual void SetDistance(int dist);
void SetDistance(int p1,int p2) {
SetDistance(p2-p1);
}
};

class Derive : public Base
{
int distance;
void SetDistance(int dist) {
distance=dist;
}
};

int main(int argc, char* argv[])
{
int a=1,b=3;
Derive d;
d.SetDistance(a,b); //这一句不能通过编译“error C2660: 'SetDistance' : function does not take 2 parameters”

return 0;
}
除了将函数改名以外,最好的解决办法是什么?
...全文
446 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2004-12-24
  • 打赏
  • 举报
回复
用虚函数,或者强制类型转换,不过要小心
Mr-Chen 2004-12-24
  • 打赏
  • 举报
回复
正确的方法用虚函数
roger_ding 2004-12-24
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{
int a=1,b=3;
Derive d;
((Base*)&d)->SetDistance(a,b);
return 0;
}
Mr_Ldh 2004-12-24
  • 打赏
  • 举报
回复
改为虚函数是不行的,这个我试过。
做成虚函数,然后在派生类重写是个办法。
欢迎大家继续讨论。
liuyan4794 2004-12-24
  • 打赏
  • 举报
回复
class Base
{
public:
virtual void SetDistance(int dist)=0;
void SetDistance(int p1,int p2) {
SetDistance(p2-p1);
}
};

class Derive : public Base
{
public:
int distance;
void SetDistance(int dist) {
distance=dist;
}
};

int main(int argc, char* argv[])
{
int a=1,b=3;
Derive d;
Base *p;
d.SetDistance(a); //这一句不能通过编译“error C2660: 'SetDistance' : function does not take 2 parameters”
p=(Base*)&d;
p->SetDistance(a,b);
return 0;
}
//强制转换为基类可以的
快乐鹦鹉 2004-12-24
  • 打赏
  • 举报
回复
同意修改函数名称,或者也做成虚函数,子类重写
老夏Max 2004-12-24
  • 打赏
  • 举报
回复
改为虚函数,即可!虚函数存在的主要原因就是可以让派生类可以调用基类的函数!
如果派生类没有实现这个函数,编译器会自动的从派生类的虚函数表中查找。在派生类中有一份基类的虚函数表。
danyueer 2004-12-24
  • 打赏
  • 举报
回复
zj888(zj888),你的方法我也尝试了,不可行,下面是报错信息:

D:\VerInfo\VerInfoDlg.cpp(152) : error C2660: 'SetDistance' : function does not take 2 parameters
danyueer 2004-12-24
  • 打赏
  • 举报
回复
我刚才尝试过了,最好的办法看起来只能是修改函数名了
danyueer 2004-12-24
  • 打赏
  • 举报
回复
我刚才尝试过了,最好的办法看起来只能是修改函数名了
zj888 2004-12-24
  • 打赏
  • 举报
回复

class Base
{
public:
virtual void SetDistance(int dist);
void SetDistance(int p1,int p2) {
SetDistance(p2-p1);
}
};

class Derive : public Base
{
public:
int distance;
void SetDistance(int dist) {
distance=dist;
}
};
zj888 2004-12-24
  • 打赏
  • 举报
回复
将类的成员改公有.
danyueer 2004-12-24
  • 打赏
  • 举报
回复
继承是无法直接重载,将基类的函数改成虚函数看看。
CodeProject-Jerry 2004-12-24
  • 打赏
  • 举报
回复
要么强制转换类型

要么写成Virtual
beyondtkl 2004-12-24
  • 打赏
  • 举报
回复
被 隱藏了。。。

這是基本得C++語法問題。。。
1. 如果是virtual 那麼被改寫,但通過指針 或引用仍然可以調用
2. 否則 被同名函數隱藏. 不能直接通過對象調用
Mr_Ldh 2004-12-24
  • 打赏
  • 举报
回复
为什么会出现这样的问题呢?请高手解释一下。
danyueer 2004-12-24
  • 打赏
  • 举报
回复
用基类指针强制类型转换是可以,不过不太安全,调用以前最好用dynamic_cast判断一下……

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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