C++和Java中的虚函数

Cod*_*key 4 c++ java virtual-functions

我一直在读虚拟功能,发现,

VF用于继承类的多态性.

因此,如果类和派生类都具有相同的函数名,则VF会将相应的函数绑定到函数调用.

即如果所讨论的函数在基类中被指定为虚拟,那么将调用派生类的函数.如果它不是虚拟的,则将调用基类的函数.

默认情况下,在Java中:所有函数都是Virtual C++:非虚拟,可以使用final,private访问修饰符在Java中使用Virtual,而在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();    

}
Run Code Online (Sandbox Code Playgroud)

现在基于这样的事实,如果它是一个虚函数,那么只调用派生类函数,我上面程序的输出应该是:

BaseVirtual
Base NonVirtual
Derieved Virtual
Base NonVirtual
Run Code Online (Sandbox Code Playgroud)

然而,它出来是:

BaseVirtual
Base NonVirtual
Derieved Virtual
Derieved NonVirtual
Run Code Online (Sandbox Code Playgroud)

当然一定是对的.所以我的问题是输出完全违反了语句如果有问题的函数在基类中被指定为virtual,那么将调用派生类的函数.如果它不是虚拟的,则将调用基类的函数.电话:

  d1.function2();    
Run Code Online (Sandbox Code Playgroud)

dea*_*mer 9

是..当且仅当您尝试使用基类指针访问派生类对象时,虚拟的角色才会出现.

以你为例: -

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出: -

Derieved Virtual
Base NonVirtual
Run Code Online (Sandbox Code Playgroud)