我有一个继承自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_foo
和m_bar
的值(b
)分别为10和30。
因此,我应该打印“10; 30”而不是“0; 1”。
非常感谢你的帮助,
答案 0 :(得分:3)
您不能使用构造函数来更改对象,只能构造它。要更改已构建的对象,您需要使用public
和protected
(如果是派生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;
}