关于重载虚函数的问题!!!!
我在重载一个基类的虚函数的时候,如果我没有重新定义函数的参数类型和参数个数
也没有修改函数的返回类,只是在函数中加了代码,这算不算重载
????
BOOL CTestDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetWindowText(m_strCaption);
…
return TRUE;
}
例子如上
问题点数:20、回复次数:41Top
1 楼e_notimpl(e_notimpl)回复于 2002-04-28 15:18:59 得分 0
就是一行代码也不加,那也是重载。Top
2 楼jbmw(山涧清泉)回复于 2002-04-28 15:34:01 得分 0
up againTop
3 楼gigix(透明)回复于 2002-04-28 15:35:20 得分 0
我做个实验先……Top
4 楼gigix(透明)回复于 2002-04-28 15:35:49 得分 0
再来……Top
5 楼gigix(透明)回复于 2002-04-28 15:37:02 得分 0
行了。对不起各位,我与此话题无关,我是来测试软件的。Top
6 楼dev_uoboy(【世界】)回复于 2002-04-28 15:49:38 得分 10
你那个叫继承,不叫重载。
重载的概念是拥有相同函数名,返回值不同(可选)参数不同(必须)的一组函数。编译器根据传递的参数来决定调用哪一个。
你说的“我没有重新定义函数的参数类型和参数个数
也没有修改函数的返回类,只是在函数中加了代码”这明显不是重载,这只是你继承了基类的虚函数而已。不能算重载!
OK?Top
7 楼jbmw(山涧清泉)回复于 2002-04-28 15:53:53 得分 0
然后重载对话框的虚成员函数OnInitDialog如下:
BOOL CTestDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetWindowText(m_strCaption);
…
return TRUE;
}
你可以看到他明显说的是重载对话框的虚成员函数,你又怎么解释
???
而且具我所知,虚函数只能是重载,没听说继承的概念!!!
Top
8 楼freezingfire(让美梦来得更猛烈些吧)回复于 2002-04-28 16:55:41 得分 10
dev_uoboy(过程编程→面向对象):
看起来显然你的过程编程→面向对象还没完^_^
C++中一般来说,说起重载指的是两件事,第一,是你说的拥有相同函数名,返回值不同(可选)参数不同(必须)的一组函数。编译器根据传递的参数来决定调用哪一个。而另外一种,则就是在类继承的时候,在字类中重复实现父类的某个同名virtual函数。注意:不要重复实现父类的非viutual函数。
坦白的说,此处的名词翻译我觉得很不好,两个都叫重载,很容易混淆。顺便问一下,有人知道override和overload的区别么?和重载的这两种情况相对应么?谢谢。Top
9 楼prototype(原型)回复于 2002-04-28 17:20:04 得分 0
override is 另外一种. overload is 第一.Top
10 楼sbg(宝宝酥)回复于 2002-04-28 17:30:28 得分 0
你那个叫多态,不叫重载。
重载的概念是拥有相同函数名,返回值不同(可选)参数不同(必须)的一组函数。编译器根据传递的参数来决定调用哪一个。
你说的“我没有重新定义函数的参数类型和参数个数
也没有修改函数的返回类,只是在函数中加了代码”这明显不是重载,这只是你继承了基类的虚函数而已。不能算重载!
Top
11 楼SphereEGO()回复于 2002-04-28 17:38:26 得分 0
楼上的兄弟
override 其实是覆盖的意思
class Base { int haha(){} };
class Child : public Base { int haha(){} };
overload 就是我们平时说的重载了
class Base { int haha(){} };
class Child : public Base { int haha(int haha){} };
hope i am rightTop
12 楼netxray(倦意的笑容)回复于 2002-04-28 17:57:08 得分 0
sphereego()好像错了
你的第二个例子是隐藏
如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)Top
13 楼netxray(倦意的笑容)回复于 2002-04-28 18:00:36 得分 0
tmd,第一个好像也错了
覆盖(override)应该在派生类中有vistual关键字Top
14 楼netxray(倦意的笑容)回复于 2002-04-28 18:04:06 得分 0
象高手请教!不知我的理解对否Top
15 楼dev_uoboy(【世界】)回复于 2002-04-28 20:15:50 得分 0
freezingfire(寻找我的爱人) 朋友感谢你的指正:)
不过我认为从基类过来的虚函数在派生类里不应该算重载吧?
重载的概念应该是针对于一个类作用于域才对吧。比如我有一个A类中有个Add()函数,在B类里也有这个函数,总不能说B类里的Add()是重载函数吧???
比如:
#include "stdafx.h"
class A
{
public:
void ppp(){printf("class A");}
};
class B
{
public:
void ppp(){printf("class B");}
};
int main(int argc, char* argv[])
{
printf("Hello World!\n");
A a;
B b;
a.ppp();
b.ppp();
return 0;
}
你不能说ppp是重载吧?所以我认为还是要在同一个类作用域里才能谈重载吧?
至于哪个到底叫什么,我认为sbg(宝宝酥)说的对,是叫多态,当时我打急了,自己也没想太多就打上去了。呵呵Top
16 楼papercrane(纸起重机)回复于 2002-04-28 21:31:27 得分 0
class A;
class B : public A{};这可以算inheritate(继承),B is derived(派生) from A。
class A{ void a(){}}; class B : public A{void a(XXX){});,无论B::a的参数是什么,都可以称为overload(不译了,免得混淆)。
class A{ virtual void a(){}}; class B : public A{void a(int){}};,这还是overload。如果在Delphi里面,还要加上关键字说明必要性,以免得不到polymorphism(多态)的结果。
class A{ virtual void a(){}}; class B : public A{void a(){}};,这可算是override了。
欢迎指教。Top
17 楼prototype(原型)回复于 2002-04-29 05:47:30 得分 0
hope the following examples may clarifies something (rather than mixing things up :-).
1. overload
void a( int );
void a( float );
void a( char );
2. override
struct A
{
virtual void a( int );
};
struct B : public A
{
virtual void a( int );
};
3. hide
struct A
{
void a( int );
};
struct B :public A
{
void a( int );
};Top
18 楼prototype(原型)回复于 2002-04-29 05:48:55 得分 0
don't know how to discriminate them in chinese. :(Top
19 楼Betta(小新)回复于 2002-04-29 09:34:29 得分 0
prototype(原型) 说得很明白了
{2, 3} 情况在调用的时候,写上类名可以explicit指定调用那个函数,
B oB ;
...
oB.B::a(10) ; // equal with oB.a(10)
oB.A::a(10) ;Top
20 楼freezingfire(让美梦来得更猛烈些吧)回复于 2002-04-29 10:01:11 得分 0
我们国家的有些计算机名词翻译的真是...唉。Top
21 楼jbmw(山涧清泉)回复于 2002-04-29 10:33:38 得分 0
我也觉得应该是语言翻译的问题
我讲的那种情况不能算是重载。
应该叫覆盖比较合适。
我刚刚看了Effective C++这本书
他对重载讲的很详细,所以我才对上面说的重载这种情况产生了怀疑。
看样子都是我们某些写书的人不够严谨。Top
22 楼reven_zl(速度还是容量)回复于 2002-04-29 11:53:44 得分 0
这个不叫重载,因为你的父类和子类中的函数的参数个数和类型都一样,这种情况叫覆盖,在《C++大学教程》中翻译为重定义。
重载必须是函数的参数个数或类型都不一样,重载可以发生在同一个类中,也可以在子类中重载基类的函数
虚函数是通过重定义实现的,而不是重载Top
23 楼zoukh(无名)回复于 2002-04-29 14:56:33 得分 0
1. overload: When two or more declarations are specified for a single name in the same scope, the name is said to be overloaded.
thus,
class a {
void f();
void f(int);
};
f is overloaded.
2. When the names are in different scope, the case is called hide.
int i;
{
int i;
}
and:
class a {
void f();
};
class b : public a
{
void f(); // hide a::f
void f(int); // hide a::f
};
3. override: when a derived declare a function with the same signature as a virtual function in the base:
class a {
virtual void f();
virtual void f2();
};
class b : public a
{
virtual void f(); // override a::f()
void f2(); // override a::f2(). virtual is not necessary here
};
Top
24 楼xuning80(Ken)回复于 2002-04-29 15:02:07 得分 0
我怎么觉得重载=override,过载=overloadTop
25 楼xuning80(Ken)回复于 2002-04-29 15:05:18 得分 0
“重”就有覆盖的意思吧,而"过"则表示有多种prototypeTop
26 楼xuning80(Ken)回复于 2002-04-29 15:10:46 得分 0
另外还有的,就是hide了,感觉是,总共也就三种形式,名字就随便叫了Top
27 楼steedhorse(晨星)回复于 2002-04-29 15:13:52 得分 0
重载重载。Top
28 楼SphereEGO()回复于 2002-04-29 17:37:58 得分 0
有收获Top
29 楼diaopeng(放飞自己)回复于 2002-04-29 21:58:53 得分 0
是虚函数重载,不是一般函数重载,虚函数重载不允许修改返回类型,参数和函数名等,但函数体可以不一样Top
30 楼diaopeng(放飞自己)回复于 2002-04-29 22:07:25 得分 0
dev_uoboy(过程编程→面向对象),你还没有理解什么叫重载与继承吧,误导大众,虚函数重载不能改变其返回类型,参数和函数名等,否则就是一般函数重载,失去了虚特性,一般重载就如你所说的那样,回去再好好看看C++的书吧Top
31 楼netxray(倦意的笑容)回复于 2002-04-30 09:12:45 得分 0
其实我说的是对的,可惜高手还没来Top
32 楼Betta(小新)回复于 2002-04-30 14:44:48 得分 0
to netxray(灯下骷髅谁一剑):
你是对的, 证据参见 prototype(原型) 的言论
a. overload 对于同一个namespace 来说
b. hide 对于继承关系的 class 来说
c. overrid 是对继承关系的动态绑定 (virtual) 来说的
坚持以上三点先
-------------------------
由于 C++ 有 using 这个关键词,可以将继承关系的成员 import 到同
一个 namespace, 也就是将hide 变成 overload 的情况,示例代码:
#include <iostream>
class CParent
{
public:
void DoSome()
{
std::cout << "CParent::DoSome()" << std::endl ;
}
} ;
class CChild
: public CParent
{
public:
using CParent::DoSome ; // if you omit this, lead to compile failure
void DoSome(int nVal)
{
std::cout << "CParent::DoSome(" << nVal << ")" << std::endl ;
}
} ;
int main()
{
CChild oSome ;
oSome.DoSome() ;
oSome.DoSome(10) ;
return 0 ;
}
Top
33 楼Betta(小新)回复于 2002-04-30 14:49:40 得分 0
看了一下,zoukh(无名) 的总结比较全面详细一点
不错,大家要铭记在心哦Top
34 楼ss_syxh(小麦)回复于 2002-04-30 15:21:28 得分 0
我比较同意 sbg(宝宝酥) 的关点.Top
35 楼Betta(小新)回复于 2002-04-30 15:31:05 得分 0
sbg(宝宝酥)引入了 多态
估计他不清楚什么是多态,
多态在面向对象中可以这样定义:一个行为在不同context下有多个解释
所以在这个问题上,overload, hide, overrid 都可以称多态
而在 C 语言中,很难出现这个词,其实是因为缺乏 namespace/class 的概念Top
36 楼hz129(古雨)回复于 2002-04-30 15:40:38 得分 0
diaopeng(遥远)
dev_uoboy(过程编程→面向对象),你还没有理解什么叫重载与继承吧,误导大众,虚函数重载不能改变其返回类型,参数和函数名等,否则就是一般函数重载,失去了虚特性,一般重载就如你所说的那样,回去再好好看看C++的书吧
虚函数支持返回类型的协变(好象是这样翻译的吧),比如:
class A {
public virtual A func() {...}
}
class B : public A {
public B func() {...}
}
是完全可以的,是C++支持多态的新特性之一。Top
37 楼Betta(小新)回复于 2002-04-30 15:49:49 得分 0
to hz129(古雨),
你的例子比较特殊啦,应该不能编译的,应该该用引用类型或指针的
还有不要象Java那样写 public
class A
{
public:
virtual A & func() {...}
} ;
class B
: public A
{
public:
virtual B & func() {...}
}
Top
38 楼SphereEGO()回复于 2002-05-01 21:05:49 得分 0
to netxray(灯下骷髅谁一剑) :
哈哈不好意思,我的确是理解错了。
改正改正:)Top
39 楼dev_uoboy(【世界】)回复于 2002-05-03 13:53:28 得分 0
hz129(古雨)
你连最简单的C++语法都没搞清楚,有资格叫我去重新看书?我看你先搞懂C++的语法再说吧……,看看是你在误导大众还是我???
C++中可以这样写么:
class A {
public virtual A func() {...}
}
class B : public A {
public B func() {...}
}
JAVA和C++比还有有本质上的差别的!!!
你学好C++在来吧,不要用JAVA的东西来解释C++的概念!!!Top
40 楼hz129(古雨)回复于 2002-05-15 14:24:52 得分 0
呵呵,最近在看C#,语法都写混了,真是不好意思,不过Betta(小新)说得对,是应该返回引用或指针才行。Top



