C++ 使用自动/指针指向子对象,访问子对象';s父方法

C++ 使用自动/指针指向子对象,访问子对象';s父方法,c++,c++11,parent-child,auto,C++,C++11,Parent Child,Auto,我试图弄清楚如何使用指向子类的指针访问父方法。有什么想法吗?我寻找了一些例子,但发现了比没有更多不同的东西 我有一个包含以下内容的测试类: auto canvasObj = parseCanvas(one, two); Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working //I also tried l_three = canvasObj->getThree(); (doesn'

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

我有一个包含以下内容的测试类:

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
{....}
以及:


看起来您正试图从派生类实例访问基类方法/数据

而不是:

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

您的函数不起作用的原因是,它是一种尝试访问“静态”成员函数而不是特定实例上的成员函数的混搭。在我的解决方案中,我访问您通过返回parseCanvas创建的canvas对象上的“getThree”数据

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

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

编辑:


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

看起来您正在尝试从派生类实例访问基类方法/数据

而不是:

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

您的函数不起作用的原因是,它是一种尝试访问“静态”成员函数而不是特定实例上的成员函数的混搭。在我的解决方案中,我访问您通过返回parseCanvas创建的canvas对象上的“getThree”数据

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

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

编辑:


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

看起来您正在尝试从派生类实例访问基类方法/数据

而不是:

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

您的函数不起作用的原因是,它是一种尝试访问“静态”成员函数而不是特定实例上的成员函数的混搭。在我的解决方案中,我访问您通过返回parseCanvas创建的canvas对象上的“getThree”数据

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

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

编辑:


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

看起来您正在尝试从派生类实例访问基类方法/数据

而不是:

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

您的函数不起作用的原因是,它是一种尝试访问“静态”成员函数而不是特定实例上的成员函数的混搭。在我的解决方案中,我访问您通过返回parseCanvas创建的canvas对象上的“getThree”数据

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

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

编辑:


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

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

Three l_three = canvasObj->getThree();

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

Three l_three = canvasObj->getThree();

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

Three l_three = canvasObj->getThree();

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

Three l_three = canvasObj->getThree();

我最后做了这件事,它成功了