首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚函数继承

虚函数继承
EN

Stack Overflow用户
提问于 2013-07-25 02:57:58
回答 3查看 29.1K关注 0票数 12

我对继承方法的虚拟属性感到困惑。

假设我们有4个类: A类、B类、C类和D类。这些类是这样继承的:A -> B -> C -> D,其中A是基类。

至此,我确信:在基类(类A)中,类方法声明以virtual开头,对于从基类派生的所有类(包括派生类中的派生类),方法都是虚拟的。(被确定为虚拟的B和C类方法)。

混淆之处在这里。如果,在基类A中,没有任何虚拟成员。相反,比方说,类B声明了一个方法为虚方法。我假设,对于属于继承链的所有派生类(C和D类),此更改将使该函数成为虚的。所以从逻辑上讲,B代表C和D,是它们的一种“基类”,对吧?还是我错了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-25 03:10:32

你是对的。

我认为,在这种情况下,最好的解决方案是尝试:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class A {
   public:
      void print(){ cout << "print A" << endl; };
};

class B: public A {
    public:
       virtual void print(){ cout << "print B" << endl; };
};

class C: public B {
     public:
        void print(){ cout << "print C" << endl; };
};

int main()
{
   A *a = new C();
   B *b = new C();

   a->print(); // will print 'print A'
   b->print(); // will print 'print C'

   return 1;
}
票数 20
EN

Stack Overflow用户

发布于 2013-07-25 03:01:16

你说的完全正确。孩子继承了祖先所拥有的东西。基类不能继承子类拥有的东西(例如新函数或变量)。虚函数是简单的函数,如果该子类更改了虚函数的实现,从而不会调用基虚函数,则该子类可以重写这些函数。

A是B,C,D的基类,B是C,D的基类,C也是D的基类。

票数 5
EN

Stack Overflow用户

发布于 2013-07-25 03:03:00

你当然能做到。虚方法是可选的重写方法,因此在类A或类B中声明它并不重要。如果不想在类A中使用该方法,则只需在类B中声明。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17842594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档