C++ 从子类中调用超类

C++ 从子类中调用超类,c++,inheritance,virtual,abstract-class,C++,Inheritance,Virtual,Abstract Class,在以下情况下,如何使其能够从子类的构造函数中调用超类的参数化构造函数 class SuperClass { int superMember; SuperClass( int superMember ) { this->superMember = superMember; }; virtual void doStuff() = 0; }; class SubClass : public SuperClass { int sub

在以下情况下,如何使其能够从
子类
的构造函数中调用
超类
的参数化构造函数

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() { 
        //... 
    };
};

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

基类的初始化应如下所示:

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() { 
        //... 
    };
};
SubClass( int superMember, int subMember ) :  SuperClass( superMember) {
        this->subMember = subMember;       
    }
您甚至还为成员使用初始化列表

SubClass( int superMember, int subMember_ ) :  
   SuperClass( superMember), subMember(subMember_){}   
(注意,
}
后面不需要分号)

但在此之前,您需要像这样从
超类继承

class SubClass : public SuperClass {/*...*/}
(如果我正确理解你的意图)


在这之后,您需要指定方法和构造函数的访问级别,我认为它们应该是
public

基类的初始化应该这样做:

SubClass( int superMember, int subMember ) :  SuperClass( superMember) {
        this->subMember = subMember;       
    }
您甚至还为成员使用初始化列表

SubClass( int superMember, int subMember_ ) :  
   SuperClass( superMember), subMember(subMember_){}   
(注意,
}
后面不需要分号)

但在此之前,您需要像这样从
超类继承

class SubClass : public SuperClass {/*...*/}
(如果我正确理解你的意图)


在这之后,您需要指定方法和构造函数的访问级别,我认为它们应该是
public

调用
子类的初始值设定项列表中的
超类
构造函数:

class SubClass : public SuperClass {
    int subMember;

// Made constructor 'public'.
public:
    SubClass(int a_superMember, int a_subMember) : SuperClass(a_superMember), 
                                                   subMember(a_subMember) {}
};
尽管
超类
是抽象的,但它仍然需要构造函数,在本例中,初始化
超级成员

超类
中,构造函数必须对
子类
可见:要么
公共
要么
受保护

class SuperClass {

    int superMember;

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

    virtual void doStuff() = 0;
};

调用
子类
的初始值设定项列表中的
超类
构造函数:

class SubClass : public SuperClass {
    int subMember;

// Made constructor 'public'.
public:
    SubClass(int a_superMember, int a_subMember) : SuperClass(a_superMember), 
                                                   subMember(a_subMember) {}
};
尽管
超类
是抽象的,但它仍然需要构造函数,在本例中,初始化
超级成员

超类
中,构造函数必须对
子类
可见:要么
公共
要么
受保护

class SuperClass {

    int superMember;

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

    virtual void doStuff() = 0;
};

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

 class SuperClass {

        int superMember;

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

        virtual void doStuff() = 0;
    };

    class SubClass :public/private/protected SuperClass
{

{ 此->子成员=子成员

        };

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

希望这能对您有所帮助。

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

 class SuperClass {

        int superMember;

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

        virtual void doStuff() = 0;
    };

    class SubClass :public/private/protected SuperClass
{

{ 此->子成员=子成员

        };

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

希望这对您有所帮助。

您是指
类子类:公共超类{
?您是指
类子类:公共超类{