虚函数关键字

Virtual function keyword

本文关键字:关键字 函数      更新时间:2023-10-16

在子类中声明带有"virtual"关键字或不带有的继承虚函数有什么区别吗?考虑到我想调用适合我对象类型的fun。看看评论。

#include <cstdio>
struct A{
    int a;
    A():a(5){}
    virtual int fun(){return a+1;}
};
struct B: public A{
    virtual int fun(){return a+5;} //I put virtual here
//  int fun(){return a+5;} // Any difference if I put virtual before or not?
};
int main(){
    B obj;
    printf("%dn", static_cast<A>(obj).fun()); // A::fun() called. Why?
    printf("%dn", static_cast<A&>(obj).fun()); // B::fun() called. As expected
    printf("%dn", static_cast<A*>(&obj)->fun()); // B::fun() called. As expected
    printf("%dn", static_cast<A>(B()).fun()); // A::fun() again. Why?
//  printf("%dn", static_cast<A&>(B()).fun()); //invalid_cast error. Why? 
    printf("%dn", static_cast<A*>(&B())->fun()); //It works! B::fun() call
    return 0;
}

如果基类中的相应函数为虚函数,则派生类中的重写函数隐式声明为"virtual"。只要确保您获得了完全相同的签名,否则您可能会无意中隐藏原始函数并声明一个新函数!

在c++ 0x中,可以自由使用override说明符。

你的两个"为什么"问题是因为切片;您正在创建类型为A的新的复制切片对象。注意,在B x; static_cast<A>(x);中,转换与说A(x)相同。

在派生类中重写的成员函数之前保留virtual关键字是可选的。运行时多态性只适用于指针或引用。