使用父类构造函数将值重新分配给继承的变量

时间:2013-04-20 22:13:08

标签: c++ oop class inheritance

我有一个继承自A类的C ++类。我可能会错过一个重要的OOP概念,这当然相当简单,但我不明白我怎么能在B实例化后使用A里面的构造函数B将新值重新分配给从A:

继承的局部变量

A类

class A{
    public:
        A(int a, int b){
            m_foo = a;
            m_bar = b;
            }
    protected:
        int m_foo;
        int m_bar;
};

B类

class B : public A{
    public:
        B(int a, int b, int c):A(a,b),m_loc(c){};
        void resetParent(){
            /* Can I use the constructor of A to change m_foo and 
             * m_bar without explicitly reassigning value? */

            A(10,30); // Obviously, this does not work :)

            std::cout<<m_foo<<"; "<<m_bar<<std::endl; 
            }
    private:
        int m_loc;
};

int main(){
    B b(0,1,3);
    b.resetParent();
    return 1;
    }

在此具体示例中,我想致电b.resetParent(),呼叫A::A()以更改m_foom_bar的值(b)分别为10和30。 因此,我应该打印“10; 30”而不是“0; 1”。

非常感谢你的帮助,

2 个答案:

答案 0 :(得分:3)

您不能使用构造函数来更改对象,只能构造它。要更改已构建的对象,您需要使用publicprotected(如果是派生class)成员。在您的示例中,A需要实现一个reset()成员函数,以后可以用它来重置它的状态。

答案 1 :(得分:2)

不,您无法调用基类构造函数来重置值。但是,您要重置的值声明为protected,这意味着B可以直接访问它们:

void resetParent()
{
    m_foo = 10;
    m_bar = 30;

    std::cout << m_foo << "; " << m_bar << std::endl; 
}

如果 A定义了=赋值运算符,您可以选择声明临时A实例并将其分配给基类:

void resetParent()
{
    *this = A(10, 30);
    // or:
    // A::operator=(A(10, 30));

    std::cout << m_foo << "; " << m_bar << std::endl; 
}