抽象类中的派生类构造函数

时间:2016-10-31 00:55:56

标签: c++ inheritance

我的抽象类中的派生类有问题 例如:

#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) {}

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

2 个答案:

答案 0 :(得分:1)

  

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

没有。

这是有充分理由的。必须在构建类之前构造超类。

当你为构造函数编写代码时,你有一个合理构造的对象。你的父母至少是构建的。

使用构造函数的初始化语法巧妙地表达了这一点。

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

答案 1 :(得分:0)

你必须在不在B构造函数体内的member-initializer列表中初始化b的a部分:

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;
      }
};
  • 您还可以定义纯虚函数,以允许派生类中的对象链接起来以实现功能。