为什么下面程序不能在VC6.0下通过编译?

双杯献酒 2003-12-30 11:13:43
// 为什么下面程序不能在VC6.0下通过编译?
#include "stdafx.h"

class A
{
public:
int Fun(int x) {return x+x;}
int Fun(int* p) {return *p * *p;}
};

class B : public A
{
int Fun(int* x){return *x;}
int Fun100()
{
// 为什么不能用 int A::Fun(int x)
return Fun(100);
}
};

int main(int argc, char* argv[])
{

return 0;
}

//编译信息
// --------------------Configuration: Main - Win32 DebugCompiling...
// Main.cpp
// E:\Projects\DEMO\Main\Main.cpp(16) : error C2664: 'Fun' : cannot convert parameter 1 from 'const int' to 'int *'
// Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
// Error executing cl.exe.

// Main.exe - 1 error(s), 0 warning(s)
...全文
60 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ross33123 2003-12-31
  • 打赏
  • 举报
回复
呵呵

C++ 正式的说法是

名字隐藏规则和名字查找规则

现在感觉碰到问题还是看 ISO 的原始文档

虽然晦涩了一点
windywalk 2003-12-31
  • 打赏
  • 举报
回复
重载是将父类的函数隐藏,而不是覆盖,加上完整的函数调用,当然可以用
HanZhu1 2003-12-31
  • 打赏
  • 举报
回复
在重载时,你的参数是 100 ,他不知道去调用哪个

试试这样
int p = 100;
return A::Fun(p); //这必须加 A:
superS 2003-12-31
  • 打赏
  • 举报
回复
我记得标准C++就这么规定的,对于函数重载,如果基类中有重载函数,派生类中没有同名字的重载函数,则派生类调用时基类中的所有重载函数都会作为候选函数。但是如果派生类中有相同名字的函数,则在编译时基类中的同名函数不会作为候选函数,所有候选函数只来自派生类自己。术语好象叫遮蔽吧。

你的就是这个问题,不过如楼上所说可以加上域修饰符调用。

在<C++ primer>上有说明。我记得是比较靠后的几章。
codelover 2003-12-31
  • 打赏
  • 举报
回复
class A
{
public:
int Fun(int x) {return x+x;}
int Fun(int* p) {return *p * *p;}
};

class B : public A
{
int Fun(int* x){return *x;}
int Fun100()
{
return A::Fun(100); //可以调用啊
}
};

int main(int argc, char* argv[])
{

return 0;
}
bluebohe 2003-12-30
  • 打赏
  • 举报
回复
class A
{
public:
int Fun(int x) {return x+x;}
int Fun(int* p) {return *p * *p;}
};

class B : public A
{
int Fun(int* x){return *x;}
int Fun100()
{
// 为什么不能用 int A::Fun(int x)
return A::Fun(100);
}
};

int main(int argc, char* argv[])
{

return 0;
}
cadinfo 2003-12-30
  • 打赏
  • 举报
回复
继续看C++的书籍,把基础的搞清楚,
VC6编译器在模板方面的支持确实不够完美,
距离C++的标准还是很远,不过你初学C++,
可不用怀疑编译器:@@
bjzhaoxiao 2003-12-30
  • 打赏
  • 举报
回复
学习中。。。
zhucde 2003-12-30
  • 打赏
  • 举报
回复
还有,在B中是可以用A的Func的,
这样
class B : public A
{
int Fun(int* x){return *x;}
int Fun100()
{
int m=A::Fun(100);//因为你在B里对A中的Func进行了重载,所以如果你用
//Func()将优先调用本类的,这样就会出错,类型不符
//所以要加A::表明是父类的,如果你不重载那就可以直
//接int m=Func(100),这样,只会调用父类的Func()
return m;
}
};
zhucde 2003-12-30
  • 打赏
  • 举报
回复
还有,在B中是可以用A的Func的,
这样
class B : public A
{
int Fun(int* x){return *x;}
int Fun100()
{
int m=A::Fun(100);//因为你在B里对A中的Func进行了重载,所以如果你用
//Func()将优先调用本类的,这样就会出错,类型不符
//所以要加A::表明是父类的,如果你不重载那就可以直
//接int m=Func(100),这样,只会调用父类的Func()
return m;
}
};
osborn 2003-12-30
  • 打赏
  • 举报
回复
iicup (双杯献酒) 兄弟,一句话,

int*虽然也是一个整数,但是编译器如果这都让你过了,

那运行中会有多少问题啊?严格的编译器才是好编译器。
曾经的猎狐 2003-12-30
  • 打赏
  • 举报
回复
error C2664: 'Fun' : cannot convert parameter 1 from 'const int' to 'int *'

参数1不能从 const int 转成 int *

具体做法同意
zhucde(【风间苍月】)
dddd8888 2003-12-30
  • 打赏
  • 举报
回复
你传人的值,但参数的类型是指针
class A
{
public:
int Fun(int x) {return x+x;}
int Fun(int* p) {return *p * *p;}
};

class B : public A
{
int Fun(int* x){return *x;}
int Fun100()
{
// 为什么不能用 int A::Fun(int x)
int a = 100;
return Fun(&a);
}
};

int main(int argc, char* argv[])
{

return 0;
}
zhucde 2003-12-30
  • 打赏
  • 举报
回复
提示不是已经很清楚了吗?
你的Fun(int *x)参数是一个指针,
而100不是一个指针,是一个const int,这里只能代入一个指针变量才行.
如:
class B : public A
{
int Fun(int* x){return *x;}
int Fun100()
{
int *p=NULL;
return Fun(p);
}
};
Semigod 2003-12-30
  • 打赏
  • 举报
回复
不明白中,只知道要调用必须要加上 A::
ross33123 2003-12-30
  • 打赏
  • 举报
回复
这里似乎应该叫"重设"吧

如果是重载的话就可以直接调用基类的函数了
Ah 2003-12-30
  • 打赏
  • 举报
回复
调用基类的函数
return A::Fun(100);

16,472

社区成员

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

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

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