假设我有一个基类 A 和一个添加了一些额外成员的派生类 B。现在我想为 B 类提供一个 setter 函数,它可以直接访问它自己的成员,但使用临时 A 对象批量分配派生成员。这是一些示例代码:
class A
{
public:
int x;
int y;
A(int arg1, int arg2)
: x(arg1), y(arg2) {}
};
class B : public A
{
public:
int z;
B(int arg1, int arg2, int arg3)
: A(arg1, arg2), z(arg3) {}
void setB(int arg1, int arg2, int arg3) {
/*something here*/ = A(arg1, arg2);
this->z = arg3;
}
};
//编辑 我想我并不清楚这个问题实际上并不是“我可以吗?”而是“我怎样才能?”。更具体地说:我可以用什么来代替
/*something here*/
以使 setB() 实际上与以下内容相同:
void setB(int arg1, int arg2, int arg3) {
this->x = arg1;
this->y = arg2;
this->z = arg3; }
我可以像访问自己的对象一样访问对象的“基础部分”吗?
是的。它是父类的完整实例,位于派生类实例内部。
对派生类的指针或引用可转换为对父类的指针/引用。
非指针/引用,即派生类型的值也可以转换为父对象,但这会创建父子对象的副本,就像将任何其他值类型转换为另一个值类型总是创建一个副本一样。
现在我想为 B 类提供一个 setter 函数,它可以直接访问它自己的成员,但使用临时 A 对象批量分配派生成员。
简单地将
this
或取消引用的引用转换为父类类型:
(A&)*this = A(arg1, arg2); // or
*(A*)this = A(arg1, arg2);
在
/*something here*/ = A(arg1, arg2);
中,您可以将 this
转换为其基类型并调用它的隐式赋值运算符
(*((A*)this))= A(arg1, arg2);
您可以通过显式调用 A 的赋值运算符来避免强制转换:
A::operator=(A(arg1, arg2));