java - C++ 和 Java 中的虚函数

标签 java c++ virtual-functions

我一直在阅读有关虚函数的内容并发现,

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/

相关文章:

java - 为应用介绍创建滑动 fragment

c++ - std::map(和系列)查找性能问题

c++ - 在抽象类中实现纯虚函数——有什么用吗?

operator new 的 C++ 对齐,有多大关系?

C++ 访问者模式和多态性

c++ - 强制所有类在多级继承层次结构中实现/覆盖 'pure virtual' 方法

java - 全局初始化控件在不同方法中变为空

java - 如何在Tomcat中模拟connectionTimeout?

java - JPA @Id and insertable = false, updatable = false 抛出异常

c++ - 性能调整推力应用程序