gpt4 book ai didi

c++ - 请告诉我为什么虚函数在以下代码中不起作用

转载 作者:行者123 更新时间:2023-11-27 22:59:58 25 4
gpt4 key购买 nike

当我运行此代码时,由于我们在基类中使用了虚函数,因此由于延迟绑定(bind),输出如预期的那样“This is derived 2”。

    #include <iostream>
using namespace std;

class Base {
public :
virtual void show() {
cout<<"This is base class"<<endl;
}
};
class Derived : public Base {
public:
void show() {
cout<<"This is derived class"<<endl;
}
};

class D2 : public Derived {
public :
void show () {
cout<<"This is derived 2"<<endl;
}
};

int main() {
Base *obj = new D2();
obj->show();
return 0;
}

同样,如果我将代码更改为

        #include <iostream>
using namespace std;

class Base {
public :
void show() {
cout<<"This is base class"<<endl;
}
};
class Derived : public Base {
public:
virtual void show() {
cout<<"This is derived class"<<endl;
}
};

class D2 : public Derived {
public :
void show () {
cout<<"This is derived 2"<<endl;
}
};

int main() {
// your code goes here
Derived *obj = new D2();
obj->show();
return 0;
}

同样的事情发生了,虚函数是在基类中定义的,在本例中是“派生”类,指针也是“派生”类型,所以再次调用 show() 给了我最派生的版本。

但是我无法理解在“Derived”类中定义虚函数并且我使用“Base”类的基指针时发生了什么。以下代码的输出

    #include <iostream>
using namespace std;

class Base {
public :
void show() {
cout<<"This is base class"<<endl;
}
};
class Derived : public Base {
public:
virtual void show() {
cout<<"This is derived class"<<endl;
}
};

class D2 : public Derived {
public :
void show () {
cout<<"This is derived 2"<<endl;
}
};

int main() {
// your code goes here
Base *obj = new D2();
obj->show();
return 0;
}

输出:“这是基类”。请帮助我理解此输出。

最佳答案

您的最后一个代码段不起作用的原因是 void show() 函数仅在您的派生类中是 virtual,但在基类中不是。如果从 Derived 派生的任何类将覆盖它,然后您通过指向 Derived 的指针调用它,您将看到多态行为。然而,您这样做的方式是,通过基指针进行的调用是非虚拟的,因此它被分派(dispatch)给 Base 的实现。

您可以通过在基类中声明 show virtual 来解决此问题:

class  Base {
public :
virtual void show() {
// ^^^^^^^
cout<<"This is base class"<<endl;
}
};

Demo 1

或者通过指向Derived 的指针访问D2:

Derived *obj = new D2();
obj->show();

Demo 2

关于c++ - 请告诉我为什么虚函数在以下代码中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28771701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com