调用派生类函数,而不将其从多级继承中的类中标记为虚拟

时间:2013-03-21 04:46:05

标签: c++ inheritance virtual

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

好的,所以我理解你不能从基类指针调用派生类中的函数,除非它被标记为虚拟。与参考程序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()标记为虚拟,那么基本引用(&amp; a)如何调用WhichClass()函数C级?同样使用B类引用(&amp; 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;
}   

2 个答案:

答案 0 :(得分:2)

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

A &a = c;

这里基类A的指针指向类C,所以当你调用WhichClass()方法时,会调用类C的方法。

B &b = c;

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

答案 1 :(得分:2)

  1. 在类链中,如果在基类中将某些函数声明为virtual,则所有具有相同定义的波纹管级别派生类函数将自动为virtual
  2. 此功能选择背后的场景根据覆盖,由概念调用virtual table完成。所以如果你好奇,请阅读here
  3. 在C ++ 11中,您可以使用final关键字在某个级别停止覆盖。 (例如:如果你想避免类'C'覆盖类'B的WhichClass函数)。检查here