抽象类的派生类构造函数

Derived Class Constructor from an Abstract Class

本文关键字:构造函数 派生 抽象类      更新时间:2023-10-16

我有一个从抽象类派生类的问题例子:

#include <iostream>
using namespace std;
class A
{
protected:
  int a,b;
public:
  A(): a(0), b(0) {}
  A(int na,int nb): a(na), b(nb) {}
  virtual void print() = 0; // Reason to be an abstract class
};
class B : public A
{
public:
  B(int a, int b)  {A(a,b);}
  void print()
  {
    cout << a << endl;
    cout << b << endl;
  }
};
int main(){
  B clase(3,2);
  clase.print();
  return 0;
}
上面的代码给了我一个这样的错误:
lab1.cpp: In constructor ‘B::B(int, int)’:
lab1.cpp:20:10: error: invalid cast to abstract class type ‘A’
     A(a,b);
          ^
lab1.cpp:5:7: note:   because the following virtual functions are pure within ‘A’:
 class A
       ^
lab1.cpp:12:16: note:   virtual void A::print()
   virtual void print() = 0;
                ^

注意:我知道如何使它工作,B构造函数看起来像这样:

  B(int a, int b): A(a,b) {}

但是我真正的问题是,如果我想在分支中调用派生类的构造函数(像上面的代码一样)该怎么办?在分支中调用抽象构造函数的正确方法是什么?

在分支中调用抽象构造函数的正确方法是什么?

没有。

有一个很好的理由。必须先构造父类,然后才能构造类。

当你为构造函数编写代码时,你就有了一个合理构造的对象。您的父类至少被构造。

这是用构造函数的初始化语法简洁地表达出来的。

B::B(int a, int b):A(a, b) {  
     // A is complete. now we can do stuff.

必须在成员初始化列表中初始化b的A部分,而不是在b的构造函数体中:

class A
{
    virtual void print() = 0 {cout << "I am Pure function";}  
};
class B : public A
{
    public:
        B(int a, int b) : A(a,b) {}
        // B(int a, int b) {A(a,b);} /. incorrect
        void print()
      {
        cout << a << endl;
        cout << b << endl;
      }
};
  • 你也可以定义纯虚函数,以允许从派生类的对象链接功能。