【发布时间】:2012-10-12 22:44:11
【问题描述】:
我一直在阅读有关虚函数的内容并发现,
VF 用于继承类的多态性。
因此,如果类和派生类都具有相同的函数名,则 VF 会将相应的函数绑定到函数调用。
即如果所讨论的函数在基类中被指定为虚拟函数,则将调用派生类的函数。如果它不是虚拟的,则会调用基类的函数。
在 Java 中默认情况下:所有函数都是虚拟 C++:非虚拟,可以在 Java 中通过使用 final、private 访问修饰符将其变为虚拟,而在 C++ 中使用 Virtual 关键字将函数变为虚拟。
基于以上理论,我写了代码:
#include <iostream>
class base{
public :
virtual void function1(){
std::cout<<"BaseVirtual"<<std::endl;
}
void function2(){
std::cout<<"Base NonVirtual"<<std::endl;
}
};
class derieved: public base
{
public :
void function1(){
std::cout<<"Derieved Virtual"<<std::endl;
}
void function2(){
std::cout<<"Derieved NonVirtual"<<std::endl;
}
};
int main()
{
base b1;
derieved d1;
b1.function1();
b1.function2();
d1.function1();
d1.function2();
}
现在基于事实,如果它是一个虚函数,那么只调用派生类函数,我对上述程序的输出应该是:
BaseVirtual
Base NonVirtual
Derieved Virtual
Base NonVirtual
然而,结果是:
BaseVirtual
Base NonVirtual
Derieved Virtual
Derieved NonVirtual
这当然是对的。所以我的问题是输出完全违反了声明如果有问题的函数在基类中被指定为虚拟,那么派生类的函数将被调用。如果它不是虚拟的,则会调用基类的函数。对于调用:
d1.function2();
【问题讨论】:
-
您从维基百科引用的那句话需要编辑或删除。
-
哇..你怎么知道它来自维基百科..无论如何..感谢您消除疑问..我不应该依赖维基百科..
-
“并且可以通过使用 final、private 访问修饰符在 Java 中变为虚拟”没有任何意义。如果有人提供维基百科链接,我会修复它。
-
其实我修复了this Wiki page,欢迎这里或那里的cmets,但它不包含我上面引用的文字,仍然欢迎指点。
-
@EJP 谢谢你,先生.. 你让世界变得更美好:)
标签: java c++ virtual-functions