【问题标题】:Calling superclass from within subclass从子类中调用超类
【发布时间】:2012-03-19 00:22:25
【问题描述】:

在以下情况下,我怎样才能使我可以从SubClass的构造函数中调用SuperClass的参数化构造函数?

class SuperClass {

    int superMember;

    SuperClass( int superMember ) {
        this->superMember = superMember;
    };

    virtual void doStuff() = 0;
};

class SubClass : public SuperClass {

    int subMember;

    SubClass( int superMember, int subMember ) {
        this->subMember = subMember;
        SuperClass( superMember );
    };

    void doStuff() { 
        //... 
    };
};

在SuperClass 中是否应该有一个构造函数(鉴于它是抽象的),或者我应该将成员初始化代码移动到一个单独的函数中,比如SuperClass 中的init( ... )?在这种情况下,我将如何从SubClass 中调用此函数?

【问题讨论】:

  • 您的意思是class SubClass : public SuperClass { 吗?

标签: c++ inheritance virtual abstract-class


【解决方案1】:

在SubClass的初始化列表中调用SuperClass构造函数:

class SubClass : public SuperClass {
    int subMember;

// Made constructor 'public'.
public:
    SubClass(int a_superMember, int a_subMember) : SuperClass(a_superMember), 
                                                   subMember(a_subMember) {}
};

即使SuperClass 是抽象的,它仍然需要一个构造函数,在这种情况下初始化superMember。

在SuperClass 中,构造函数必须对SubClass 可见:public 或protected:

class SuperClass {

    int superMember;

public: // or protected:
    SuperClass( int superMember ) {
        this->superMember = superMember;
    };

    virtual void doStuff() = 0;
};

【讨论】:

    【解决方案2】:

    基类的初始化应该这样完成:

    SubClass( int superMember, int subMember ) :  SuperClass( superMember) {
            this->subMember = subMember;       
        }
    

    您甚至还为成员使用了初始化列表

    SubClass( int superMember, int subMember_ ) :  
       SuperClass( superMember), subMember(subMember_){}   
    

    (注意}后面不需要分号)

    但在此之前你需要像这样继承Superclass

    class SubClass : public SuperClass {/*...*/}
    

    (如果我理解你的意图的话)

    然后你需要指定你的方法和构造函数的访问级别,我相信它们应该是public。

    【讨论】:

      【解决方案3】:

      我在下面写了调用参数化构造函数的代码。 在参数化构造函数本身中进行初始化总是更好。 您应该记住的另一件事是,如果您的继承是私有的,那么您不能使用 init() 函数。

       class SuperClass {
      
              int superMember;
      
              SuperClass( int superMember ) {
                  this->superMember = superMember;
              };
      
              virtual void doStuff() = 0;
          };
      
          class SubClass :public/private/protected SuperClass
      

      {

              int subMember;
      
              SubClass( int superMember, int subMember ) :superClass(superMember)
      

      { this->subMember = subMember;

              };
      
              void doStuff() { 
                  //... 
              };
          };
      

      希望这会对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 2013-03-22
        相关资源
        最近更新 更多