从子类中调用超类

Calling superclass from within subclass

本文关键字:超类 调用 子类      更新时间:2023-10-16

在以下情况下,我如何才能从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中调用此函数?

调用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可见:publicprotected:

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

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

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

我在下面编写了调用参数化构造函数的代码。在参数化构造函数本身中进行初始化总是更好的。您还应该记住的一件事是,如果您的继承是私有的,那么您就不能使用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() { 
            //... 
        };
    };

希望这对你有帮助。