使用自动/指向子项的指针,访问子项的父方法

using auto/pointer to child, access child's parent method

本文关键字:指针 访问 方法      更新时间:2023-10-16

我试图弄清楚如何使用指向子类的指针访问父方法。 有什么想法吗? 我寻找示例,但发现更多不同的东西。 子访问父级 - 不同。

我有一个测试类,内容如下:

auto canvasObj = parseCanvas(one, two);
Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working
//I also tried l_three = canvasObj->getThree(); (doesn't work)

哪里:

class CanvasObject final : public ParentOfCanvas
{....}

和:

class ParentOfCanvas : public AnotherObject
{
public:
     Three getThree();
       ...
}

您似乎正在尝试从派生类实例访问基类方法/数据。

而不是:

auto canvasObj = parseCanvas(one, two); 
Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working

用:

auto canvasObj = parseCanvas(one, two);
Three l_three = canvasObj.getThree(); // or maybe canvasObj->getThree()

你的不起作用的原因是,它有点像尝试访问"静态"成员函数而不是特定实例上的函数的错误混搭。 在我的解决方案中,我访问您从 parseCanvas 返回中创建的画布对象上的"getThree"数据。

或者,如果我的解决方案不起作用,那么 parseCanvas 可能返回了错误的数据类型。 也就是说,我希望它返回 CanvasObject,但您没有为该方法提供签名。 您可能需要将 auto 转换为您希望的确切类型 (CanvasObject*)。 parseCanvas 可能返回一个 const 类型,而 getThree 没有标记为 const,所以你很难调用它。

也许如果您提供了确切的编译器错误,我们可以进一步缩小范围。

编辑:

根据您的注释,画布对象将返回一个进一步的基类指针,并且您正在尝试调用派生类的方法。 这是做不到的。 你需要调整你的parseCanvas方法以返回派生类指针,或者你需要(非常糟糕的主意)将指针从基类强制转换为派生类(如果你真的知道它真的是那种类型)。

您需要使用对象变量,如下所示:

Three l_three = canvasObj->getThree();

我最终这样做了,它正在工作:

base_static_cast<AnotherObject, Three>(canvasObject)->getThree();

校正。 经过进一步测试,我必须这样做:

static_cast(canvasobject.get())->getThree();

它试图从错误的地方获取信息。