使用 auto/pointer 到 child,访问 child 的 parent 方法
using auto/pointer to child, access child's parent method
我正在尝试弄清楚如何使用指向 child class 的指针来访问 parent 方法。有任何想法吗?我寻找了例子,但发现了更多不同的东西。 child access parent - different。
我有一个测试class,内容如下:
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();
...
}
看起来您正在尝试从派生的 class 实例访问基础 class methods/data。
而不是:
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()
你的方法不起作用的原因是,它是一种试图访问 'static' 成员函数而不是特定实例上的成员函数的错误混搭。在我的解决方案中,我访问了您从 parseCanvas 的 return 创建的 canvas 对象上的 'getThree' 数据。
或者,如果我的解决方案不起作用,那么 parseCanvas 可能 return 使用了错误的数据类型。也就是说,我希望它是 return CanvasObject,但您没有为该方法提供签名。您可能需要将 auto 转换为或替换为您想要的确切类型 (CanvasObject*)。可能是 parseCanvas return 是一个 const 类型,而 getThree 没有被标记为 const,所以你调用它会遇到麻烦。
也许如果您提供了确切的编译器错误,我们可以进一步缩小范围。
编辑:
根据您的评论,canvas 对象被 return 编辑为进一步的基 class 指针,并且您正在尝试调用派生的 class 方法。这是做不到的。您需要将您的 parseCanvas 方法调整为 return 一个派生的 class 指针,或者您需要(非常糟糕的想法)将您的指针从基 class 转换为派生的(如果您真的知道它真的那个类型)。
您需要像这样使用对象变量:
Three l_three = canvasObj->getThree();
我完成了这个并且它正在工作:
base_static_cast<AnotherObject, Three>(canvasObject)->getThree();
更正。经过进一步测试,我不得不这样做:
static_cast(canvasobject.get())->getThree();
它试图从错误的地方获取信息。
我正在尝试弄清楚如何使用指向 child class 的指针来访问 parent 方法。有任何想法吗?我寻找了例子,但发现了更多不同的东西。 child access parent - different。
我有一个测试class,内容如下:
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();
...
}
看起来您正在尝试从派生的 class 实例访问基础 class methods/data。
而不是:
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()
你的方法不起作用的原因是,它是一种试图访问 'static' 成员函数而不是特定实例上的成员函数的错误混搭。在我的解决方案中,我访问了您从 parseCanvas 的 return 创建的 canvas 对象上的 'getThree' 数据。
或者,如果我的解决方案不起作用,那么 parseCanvas 可能 return 使用了错误的数据类型。也就是说,我希望它是 return CanvasObject,但您没有为该方法提供签名。您可能需要将 auto 转换为或替换为您想要的确切类型 (CanvasObject*)。可能是 parseCanvas return 是一个 const 类型,而 getThree 没有被标记为 const,所以你调用它会遇到麻烦。
也许如果您提供了确切的编译器错误,我们可以进一步缩小范围。
编辑:
根据您的评论,canvas 对象被 return 编辑为进一步的基 class 指针,并且您正在尝试调用派生的 class 方法。这是做不到的。您需要将您的 parseCanvas 方法调整为 return 一个派生的 class 指针,或者您需要(非常糟糕的想法)将您的指针从基 class 转换为派生的(如果您真的知道它真的那个类型)。
您需要像这样使用对象变量:
Three l_three = canvasObj->getThree();
我完成了这个并且它正在工作:
base_static_cast<AnotherObject, Three>(canvasObject)->getThree();
更正。经过进一步测试,我不得不这样做:
static_cast(canvasobject.get())->getThree();
它试图从错误的地方获取信息。