Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 派生类中的方法在引用的类中没有*virtual*关键字的情况下执行 class车辆 { 公众: 虚拟空驱动器() { cout_C++_Overriding_Virtual Functions - Fatal编程技术网

C++ 派生类中的方法在引用的类中没有*virtual*关键字的情况下执行 class车辆 { 公众: 虚拟空驱动器() { cout

C++ 派生类中的方法在引用的类中没有*virtual*关键字的情况下执行 class车辆 { 公众: 虚拟空驱动器() { cout,c++,overriding,virtual-functions,C++,Overriding,Virtual Functions,virtual关键字是一个说明符,表示应该通过动态分派调用函数。它不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的 通过动态分派调用的是覆盖它的最派生类的版本。因此在您的例子中,b指向的对象的动态类型是supervehicle,因此调用的函数是supervehicle::drive,而不是bus::drive 一个相关的说明符,在C++标准的2011次修订中是“代码>覆盖/ 。您应该在重写函数上使用它,让编译器知道您试图重写虚拟函数。如果您在函数原型中出错,编译器将发出

virtual关键字是一个说明符,表示应该通过动态分派调用函数。它不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的

通过动态分派调用的是覆盖它的最派生类的版本。因此在您的例子中,
b
指向的对象的动态类型是
supervehicle
,因此调用的函数是
supervehicle::drive
,而不是
bus::drive


一个相关的说明符,在C++标准的2011次修订中是“代码>覆盖/ <代码>。您应该在重写函数上使用它,让编译器知道您试图重写虚拟函数。如果您在函数原型中出错,编译器将发出诊断。

< p> <代码>虚拟< /Cord>关键字是表示应该通过动态分派调用函数的说明符。它不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的

通过动态分派调用的是覆盖它的最派生类的版本。因此在您的例子中,
b
指向的对象的动态类型是
supervehicle
,因此调用的函数是
supervehicle::drive
,而不是
bus::drive


<> >一个相关的说明符,在C++标准的2011次修订中是“代码>重写< /Cord>”。应该在重写函数上使用它,让编译器知道你试图重写虚拟函数。如果你在函数原型中犯了一个错误,编译器会发出一个诊断。

。这与虚拟I无关。n正确性。不正确,但
bus*b;b=new supervehicle();
应该是
bus*b=new supervehicle();
。在创建变量时养成初始化变量的习惯。谢谢。我会记住这一点。这与虚拟继承无关。不正确,但
bus*b;b=new supervehicle()
应该是
bus*b=new supervehicle();
。在创建变量时要养成初始化变量的习惯。谢谢。我会记住这一点。
class vehicle
{
public:
    virtual void drive()
    {
        cout<<"in vehicle drive"<<endl;
    }
};
class bus:public vehicle
{
public:
    void drive()
    {
        cout<<"in bus drive"<<endl;
    }
};
class supervehicle:public bus
{
public:
    void drive()
    {
        cout<<"in supervehicle"<<endl;
    }
};


int main()
{
    bus *b;
    b=new supervehicle();
    b->drive();
    return 0;
}