我可以像访问自己的对象一样访问对象的“基础部分”吗?

问题描述 投票:0回答:3

假设我有一个基类 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; }
c++ oop inheritance
3个回答
2
投票

我可以像访问自己的对象一样访问对象的“基础部分”吗?

是的。它是父类的完整实例,位于派生类实例内部。

对派生类的指针或引用可转换为对父类的指针/引用。

非指针/引用,即派生类型的值也可以转换为父对象,但这会创建父子对象的副本,就像将任何其他值类型转换为另一个值类型总是创建一个副本一样。

现在我想为 B 类提供一个 setter 函数,它可以直接访问它自己的成员,但使用临时 A 对象批量分配派生成员。

简单地将

this
或取消引用的引用转换为父类类型:

 (A&)*this = A(arg1, arg2); // or
 *(A*)this = A(arg1, arg2);

1
投票

/*something here*/ = A(arg1, arg2);
中,您可以将
this
转换为其基类型并调用它的隐式赋值运算符

(*((A*)this))= A(arg1, arg2);

0
投票

您可以通过显式调用 A 的赋值运算符来避免强制转换:

A::operator=(A(arg1, arg2));
© www.soinside.com 2019 - 2024. All rights reserved.