假设我有一个基类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; }
答案 0 :(得分:2)
我可以访问'基础部分'我的对象好像是它自己的一个对象?
是。它是父类的完整实例,它位于派生类实例中。
指向派生类的指针或引用可转换为指向父项的指针/引用。
非指针/引用,即派生类型的值也可以转换为父类,但是它会创建父子对象的副本,就像将任何其他值类型转换为另一个值类型一样,总是会创建一个副本。
现在我想为B类设置一个setter函数,直接接受它自己的成员,但是使用临时A对象批量分配派生成员。
简单地将this
或取消引用的引用转换为父类类型:
(A&)*this = A(arg1, arg2); // or
*(A*)this = A(arg1, arg2);
答案 1 :(得分:1)
在/*something here*/ = A(arg1, arg2);
中,您可以将this
投射到其基本类型并将其称为隐式赋值运算符
(*((A*)this))= A(arg1, arg2);