纯虚函数的继承

时间:2018-04-29 08:12:18

标签: c++ oop c++11

有人可以清除这些概念并回答这些问题。提前谢谢。

A类是一个基类,有一个名为display的纯虚函数。

var cart = [
{id: 1},
{id: 2},
{id: 3},
{id: 4, q: 5} // q is set because user selected id num 4, five times
];

B类是继承A类的派生类。此外,B会覆盖显示功能

class A 
{ 
  public:
       virtual void display()const=0;

};

Q1:现在B包含1个重写显示和1个继承纯虚拟显示,对吧?或者由于覆盖而使纯虚拟虚拟世界变得不存在。

我问这个是因为我面临的最终问题是: Q2:假设B确实覆盖了显示功能,现在,如果有新的类

class B:public A 
{ 
  public:
       void display()const{cout<<"Always"<<endl;}

};

现在,我清楚这个概念,即所有第一级派生类(如B)都必须在它们上面覆盖纯虚函数(来自A类),假设它们是覆盖它,现在如果有一个新的类C派生自一个第一级派生类(B类),它还需要覆盖纯虚函数(显示)还是不需要它因为它在B类中被重写而C继承了B(因此接收了显示函数的覆盖?

4 个答案:

答案 0 :(得分:2)

  

假设有一个虚拟基类A

class A 
{ 
  public:
       virtual void display()const=0;

};

class B:public A 
{ 
  public:
       void display()const{cout<<"Always"<<endl;}

};
  

Q1:现在B包含1个重写显示和1个继承纯虚拟显示,对吧?或者由于覆盖而使纯虚拟虚拟世界变得不存在。

函数的继承是替换。如您所说,基类函数在派生类中不存在。无论基类功能是否为虚拟,都是如此。

  

Q2:假设B确实覆盖了显示功能,现在,如果有新的类C

class C : public B 
{ 
    ...
};
  

是否还需要覆盖纯虚函数(显示)?

不,C获取B的所有功能,包括display()的具体实现

但是,C可能可选再次覆盖display()功能。等等等等。一个类可以被子类化的次数没有限制。

答案 1 :(得分:0)

  

Q1:现在B包含1个被覆盖的显示和1个继承的纯虚拟显示,对吧?

我不知道你的意思。

C不需要覆盖display。如果它没有,它将只使用从B继承的那个。

答案 2 :(得分:0)

  

Q1:现在B包含1个重写显示和1个继承纯虚拟显示,对吧?或者由于覆盖而使纯虚拟虚拟世界变得不存在。

这里的第一个问题毫无意义。类BA继承纯虚拟,并覆盖它。它也没有“包含”。

A::display()确实存在,作为可在B内引用的有效命名实体。例如,如果定义了A::display();

class A 
{ 
    public:
        virtual void display()const=0;
};

//   yes, defining a pure virtual function is allowed, albeit optional 
void A::display() const       
{
    std::cout << "A!\n";
}

然后B::display()可以调用它。

class B:public A 
{ 
   public:
       void display()const
       {
           A::display();
           std::cout<<"Always"<<endl;
       }
};

所以在这种情况下都存在A::display()B::display()B::display()的上述代码将编译(因为编译器将A::display()B::display()识别为函数的不同名称),无论是否定义A::display()。 (如果未定义A::display(),链接器通常会报告缺少的符号。

  

Q2:假设B确实覆盖了显示功能,现在,如果有新类

class C:public B 
{ 
    public:
};
     

现在,我清楚地知道所有第一级派生类(如B)都必须在它们上面覆盖纯虚函数(来自A类),假设它们会覆盖它,现在如果有一个新的类C派生自一个第一级派生类(B类),它还需要覆盖纯虚函数(显示),还是不需要它,因为它在B类中重写,C继承B(因此接收显示函数的覆盖?

如果B已覆盖display(),则C会将display()作为非纯虚函数继承。这意味着,如果B可以实例化,那么C也可以。

如果C未覆盖继承的display(),则some_c->display()将调用从B继承的版本,即B::display()

如果C覆盖display() - 任何继承的虚函数允许 - 那么它可以以任何方式实现C::display()

答案 3 :(得分:0)

  

现在B包含1个被覆盖的显示和1个继承的纯虚拟显示,对吧?

NO。

你可以这样理解:

  

或者由于覆盖而使纯虚拟虚拟世界变得不存在。

当您声明一个虚拟函数时,会添加一个虚拟(函数)表(对于类),该表包含指向虚函数的函数指针。每当声明覆盖函数时,它都会替换虚拟表中的函数指针。

如果B覆盖了该函数,那么它的函数指针就会进入虚拟表。

C不必覆盖。它将从B获得函数。

C可以覆盖该功能。然后它的指针将进入虚拟表。

B不必覆盖。但是,无法创建B的变量。然后C应该覆盖该函数(如果你想要一个变量)