我可以访问'基础部分'我的对象好像是它自己的一个对象?

时间:2017-01-11 22:50:17

标签: c++ oop inheritance

假设我有一个基类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; }

2 个答案:

答案 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);