2

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

好的,所以我知道你不能从基类指针调用派生类中的函数,除非它被标记为虚拟。与参考程序 1 一样,如果未将 WhichClass() 标记为虚拟,则它无法调用 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 所示),并且如果在 B 类中未将WhichClass() 标记为虚拟,那么基引用(&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;
}   
4

2 回答 2

2

因为当您在基类中将方法设为虚拟并创建指向任何派生类的基类指针时,在这种情况下,它会调用最派生类的函数。在你的情况下,你有,

A &a = c;

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

B &b = c;

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

于 2013-03-21T04:57:38.137 回答
2
  1. 在类链中,如果您在基类中声明某个函数,则virtual所有具有相同定义的波纹管级派生类函数将自动为virtual.
  2. 这个功能选择背后的场景根据覆盖,由概念调用完成virtual table。因此,如果您对此感到好奇,请阅读此处
  3. In C++ 11 you can use final keyword to stop overriding at some level. (eg: if you want to avoid class 'C' to override class 'B's WhichClass function). check here
于 2013-03-21T05:25:02.177 回答