gpt4 book ai didi

c++ - 在多级继承的中间类中调用派生类函数而不将其标记为虚拟

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:50 25 4
gpt4 key购买 nike

我在想这可能是一个重复的问题,但我尝试阅读了几乎所有相关的帖子,但没有一篇是专门针对我正在寻找的内容的。

好的,所以我知道您不能从基类指针调用派生类中的函数,除非它被标记为虚拟。和引用程序1一样,如果WhichClass()没有被标记为virtual,则不能调用B类的WhichClass()。

#include<iostream>
using namespace std;
class A
{
public:
const char* WhichClass(){return "A";}
};
class B:public A
{
public:
const char* WhichClass(){return "B";}
};

int main()
{
B b;
A &a = b;
cout<<"In class "<<a.WhichClass();
return 0;
}

如果我将它标记为虚拟的,那么它会从基类调用最派生类的函数。现在假设如果我添加另一个继承自 B 的类 C(如程序 2 所示),并且如果 WhichClass() 在类 B 中未标记为虚拟,那么基引用(&a)如何调用类 C 中的 WhichClass() 函数?同样对于 B 类引用 (&b),如果根据我们在程序 1 中观察到的那样,它甚至没有在 B 类中标记为虚拟,它如何在 C 中调用 WhichClass()?

#include<iostream>
using namespace std;
class A
{
public:
virtual const char* WhichClass(){return "A";}
};
class B:public A
{
public:
const char* WhichClass(){return "B";}
};
class C:public B
{
public:
const char* WhichClass() { return "C";}
};
int main()
{
C c;
A &a = c;
B &b = c;

cout<<"In class " << a.WhichClass() << endl;
cout<<"In class " << b.WhichClass() << endl;
return 0;
}

最佳答案

因为当你在基类中使一个方法成为虚拟方法并创建一个指向任何派生类的基类指针时,那么在这种情况下它会调用最派生类的函数。在你的情况下,

A &a = c;

此处基类 A 的指针指向类 C,因此当您调用 WhichClass() 方法时,将调用类 C 的方法。

B &b = c;

即使在此处,当您使用基类指针调用函数时,也会根据您指向的类调用大多数派生类的函数。在这种情况下,类 B 的指针指向类 C 的对象,因此将调用类 C 的 WhichClass() 方法。有关更多详细信息,请查看此,polymorphism

关于c++ - 在多级继承的中间类中调用派生类函数而不将其标记为虚拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15539691/

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