我一直在阅读有关虚函数的内容并发现,
VF 用于继承类的多态性。
因此,如果一个类和派生类都具有相同的函数名称,VF 会将适当的函数绑定(bind)到函数调用。
即如果所讨论的函数在基类中指定为虚拟函数,则将调用派生类的函数。如果它不是虚拟的,将调用基类的函数。
默认情况下在 Java 中:所有函数都是 Virtual 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();
最佳答案
是的。当且仅当您尝试使用基类指针访问派生类对象时,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=&d1;
b1->function1();
b1->function2();
return 0;
}
输出:-
Derieved Virtual
Base NonVirtual
关于java - C++ 和 Java 中的虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13023028/