是C++语法傻还是我笨???

Keanu_Rocky 2002-08-14 09:59:15
#include <iostream.h>
class a
{
public:
int a;
void t(int j) {cout << 3;}
};

class b:public a
{
public:
int b;
void t() {cout << 4;}
};

void main()
{
a c1;
b c2;
c2.t(2); //Error
}
在class b内定义的function member t与它的base class内定义的function member t参数个数不同,为什么仍然认为它被override?
...全文
28 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tommy 2002-08-15
  • 打赏
  • 举报
回复
C++ Primer、TCPPL中都有详细的解释,说明了为什么要这样做。看看就明白了
bao_zey 2002-08-15
  • 打赏
  • 举报
回复
C++的语法这么回傻呢?傻的是人没有真正的理解C++
boy_qiqi 2002-08-15
  • 打赏
  • 举报
回复
我觉的不能说C++的语法傻,因为在性能和效率之间是不好取舍的
bao_zey 2002-08-15
  • 打赏
  • 举报
回复
C++继承类,函数重载
Method 1:
class A{
public:
void t(int n){printf("The Message is from A:%d\n",n);};
};

class B:public A{
public:
using A::t; //C++的推荐用法,也可用于namespace中;
void t(){printf("The Message is from B\n");};
};

Method 2:
class A{
public:
void t(int n){printf("The Message is from A:%d\n",n);};
};

class B:public A{
public:
void t(int n){A::t(n);};//重载方法;
void t(){printf("The Message is from B\n");};
};

Method 3:
class A{
public:
void t(int n){printf("The Message is from A:%d\n",n);};
};

class B:public A{
public:
void t(){printf("The Message is from B\n");};
};

main()
{ B b;
b.A::t(2);//在B的实例调用中指明方法的来源;
}

Method 4:
class A{
public:
void t(int n){printf("The Message is from A:%d\n",n);};
};

class B:public A{
public:
void t(){printf("The Message is from B\n");};
#define t(n) A::t(n)
};
hfycl 2002-08-15
  • 打赏
  • 举报
回复
我来迟了
还有分给吗
cxjddd 2002-08-14
  • 打赏
  • 举报
回复
有楼上有用法吗?
没有吧。
记得不久前,我用Borland C/C++(>=4.0),想这样写:
#include <iostream>
using namespace std;
main()
{
cout<<"Hello!World!";
}
///////////////////////
using namespace是高亮度显示的,我以为,没有错。谁知,BC的using namespace根本不是这样用的。根本不是C++标准。一查Help,看到了关于using namespace的,可是一看,没有文件级的。其它的就只有using有用法,就有楼上的哪种用法。
可是,楼上的using是C++标准中的吗?我不知道。
Tommy 2002-08-14
  • 打赏
  • 举报
回复
按标准C++,不用专门定义一个inline函数的,用using将基类中的函数引入派生类就可以了。不过,VC下好像还是不行?

class b:public a
{
public:
int m_b;
void t() {cout << 4;}
using a::t; // 将a::t引入到b的名字空间
}
green_girl 2002-08-14
  • 打赏
  • 举报
回复
见 C++primer P738, 有很详细的说明

你的程序应该改成:
#include <iostream.h>
class a
{
public:
int m_a;
void t();
void t(int j) {cout << 3<<"\n";}
};

class b:public a
{
public:
int m_b;
void t() {cout << 4;}
void t(int p){ // 这里加了个inline函数
a::t(p);
}


};

void main()
{
a c1;
b c2;
c1.t(2);
c2.t(2);
}



tnt_tnt 2002-08-14
  • 打赏
  • 举报
回复
对,在这里是没有办法直接调用的!
Tommy()的办法是很全的,呵呵,可惜我就没有什么好说的了!
kof99th 2002-08-14
  • 打赏
  • 举报
回复
想象一下你只知道派生类有函数t(int),结果你不小心写成了t(),调用了一个你根本不知道的函数,不会有任何的警告,你认为有问题吗?
Tommy 2002-08-14
  • 打赏
  • 举报
回复
C++ Primer中有详细论述,解释了这种情况下为什么要这样处理,这就不多说了。

反正就是jinfeng_wang(CSDN,你的速度象蜗牛) 中提到的原因。
如果要用a::t,可以明确调用c2.a::t(2),也可以在b类的定义中加入using a::t,将a::t引入到b的名字空间。
c_vector 2002-08-14
  • 打赏
  • 举报
回复
override覆盖或重写
overload重载
Keanu_Rocky 2002-08-14
  • 打赏
  • 举报
回复
呵呵,没关系,除zuoyefeng的分数少一点外,大家都有分,这个东东我已经懂了,不用麻烦大家了,只有kof99th答到了我的心坎上,C++的override语法我当然懂,只是今天上午没想清楚为什么要怎么做罢了。今天下午做公共汽车的时候我基本已经想通了。
lanfengjiyue 2002-08-14
  • 打赏
  • 举报
回复
zuoyefeng() ( )
严重错误!
完全没懂虚函数概念。


我来迟,可惜这100分啊
allenwu 2002-08-14
  • 打赏
  • 举报
回复
虚函数是用来实现运行时的多态性的,要和对象指针配合使用,以我所知。
我是菜鸟,所以可能说错。但那个程序肯定是错的。只改为虚函数是肯定不行的。是通不过编译的!还是要c2.a::t(2);
还有!!!!(重要)
类和类中的变量同名,能通过编译么?
我的是不能!
请高手指点!
不过这不应该是个好习惯:)
allenwu 2002-08-14
  • 打赏
  • 举报
回复
怎么可能?
不行的!
严重不同意楼上!
zuoyefeng 2002-08-14
  • 打赏
  • 举报
回复
#include <iostream.h>
class a
{
public:
int a;
virtual void t(int j) {cout << 3;}
~~~~~~~
};

class b:public a
{
public:
int b;
virtual void t() {cout << 4;}
~~~~~~~
};

void main()
{
a c1;
b c2;
c2.t(2); //Error
}
声明成徐函数就可以了
这位仁兄估计是初学c++把
Keanu_Rocky 2002-08-14
  • 打赏
  • 举报
回复
kof99th所讲的给了我启发,我想我已经找到这个问题的答案了。
明天结帖,谢谢。

69,369

社区成员

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

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