假设我有两个班级,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{};
}
我认为你使用虚函数的想法很好。 特别是考虑到在您最初的示例中
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
。