从父类型的指针访问派生类的成员字段

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

假设我有两个班级,A 和 B:

class A { };

class B : public A
{
private:
    int Bvalue{};
}

我有一个 A 类的指针,它是 C 类的成员字段:

class C
{
private:
    A* ptr{};
};

如果指针指向

B
类的对象,那么每次我想访问该元素时,如何在不使用
Bvalue
的情况下访问
dynamic_cast
?如果操作完成时间较长,动态铸造会很慢。有没有办法转换 ptr 成员字段的类型?

我尝试在 A 类中创建一个返回 Bvalue 的虚函数,但显然 A 类无权访问 Bvalue,所以它不起作用。我可以让它返回 0,然后我也会将该函数放入 classB 中,但这不是最佳选择。这是它的样子:

class A
{
public:
    virtual int getBvalue() { return 0; };
};

class B : public A
{
public:
    int getBvalue( return Bvalue; );

private:
    int Bvalue{};
}
c++ c++17
1个回答
0
投票

我认为你使用虚函数的想法很好。 特别是考虑到在您最初的示例中

Bvalue
B
类的私有成员。

如果问题是“那么父类中的虚方法应该返回什么?” 您可以通过返回参考来解决它:

class A
{
public:
    virtual void getBvalue(int& out_val) { };
};

class B : public A
{
public:
    void getBvalue(int& out_val) override {out_val = Bvalue};

private:
    int Bvalue{};
}

这并不理想,但适合任务。 就个人而言,如果我不想为“空状态”“分配”字段的特定值(如示例中的

0
),我仍然会考虑按值返回。 我会尝试从 getter 返回
std::optional
。 然后你的父虚拟方法可以返回
std::nullopt
。 或者您可以返回指向该值的指针,父方法将返回
nullptr

© www.soinside.com 2019 - 2024. All rights reserved.