虚函数应该在哪里定义?

3
我有一个关于C++中虚函数的问题,例如,A是一个基类,类B继承自A,而类C继承自B,我们可以在B中定义一个虚函数,并在C中重新定义它吗?我的意思是,这个虚函数应该在A类中定义,因为A是所有BC的基类(即BC的根)吗?

“virtual” 适用于子类而非父类。 - 101010
“redefine”?你的意思是重载(overload)还是重写(override)? - Niall
我是指B和C中虚函数的实现不同。 - ratzip
@ratzily 那就是覆盖。 - Angew is no longer proud of SO
3个回答

4

不是必须 ... B是从A派生出来的一个专门对象,很可能B比A有更多功能。如果C是派生的,那么很正常的情况是从B中覆盖一个未在A中定义的函数。

例如

  • 假设A是一个表格
  • 假设B是一个圆...圆形有一个GetDiameter函数,而表格没有
  • 假设C是一个椭圆,虽然椭圆没有真正的直径,但GetDiameter函数被重载以获取两个直径中“最小”的直径。

3

virtual 关键字可以用于类继承层次结构中的任何位置,但是只有子类可以重写(override)这个虚函数(即不适用于超类)。

struct A {
  void funcA();
};

struct B : A {
  virtual funcB();
};

struct C : B {
  virtual funcB();
};

//....
  B* b = new C();
  b->funcB(); // calls C's implementation
  A* a = new C();
  a->funcB(); // fails to compile

1
是的,这完全没有问题 - 试一下:

class A
{

}

class B : public A
{
public: 
 virtual void myFunc(): { std::cout << "B here!"; }
}

class C : public B
{
public: 
 virtual void myFunc(): { std::cout << "No, C here!"; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接