0

我有一个从类 A 继承的 C++ 类 B。我可能错过了 OOP 的一个重要概念,这当然很琐碎,但我不明白如何在 B 的实例化之后使用 B 中的 A 的构造函数重新分配新值仅适用于从 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()which should callA::A()来改变m_fooand m_bar(inb为 10 和 30。因此,我应该打印“10; 30”而不是“0; 1”。

非常感谢您的帮助,

4

2 回答 2

3

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

于 2013-04-20T22:15:30.040 回答
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; 
}
于 2013-04-21T06:27:43.353 回答