【问题标题】:Access to member function in class using pointer to other class使用指向其他类的指针访问类中的成员函数
【发布时间】:2021-03-09 20:09:40
【问题描述】:

我有一个带有私有字段的简单类和带有公共成员函数的构造函数,用于打印来自其他类的所有对象名称。

这是头文件中的代码:

class Class8 : public Class6, public Class7
{
    private:
        std::string object_name;
    public: 
        Class8(std::string object_name_);
        void print_all();
};

头文件中的Class6代码:

class Class6 : public Class2, public Class3
{
    private:
        std::string object_name;
    public: 
        Class6(std::string object_name_);
        void print_name(); //prints name of this classs object (values of "object_name" private field)
};

如您所见,Class8 扩展了公共类 6 和 7。

例如,我创建指向 Class6 的指针,然后创建指向 Class8 对象。然后我使用 & 运算符将 Class8 对象的地址分配给指向 Class6 的指针,然后尝试使用包含 Class8 对象地址的指针调用 print_all()(Class8 的方法),如下所示:

    Class6* pointer_to_six = new Class6("Class_x"); 
    Class8 object_8("Object_name");
    pointer_to_six = &object_8;
    pointer_to_six->print_all();

但是编译器说 Class6' 没有名为'print_all'的成员。我做错了什么?

【问题讨论】:

    标签: c++ class pointers memory-address


    【解决方案1】:

    发生这种情况的原因是指针类型很重要。你的pointer_to_six 指向一个包含 print_all 的 class8 对象,但它的类型是class6 *。所以,它作为一个class6对象被解引用,而class6不包含一个名为print_all的成员。

    有几个解决方案。您可以使用强制转换来转换指针类型。您可以使用 c 风格的不安全类型转换来表示 ((Class8 *) pointer_to_six)->print_all();,或者您可以使用更安全的 C++ 类型转换,例如 static_cast

    您也可以使用虚函数。也就是说,每个类都以不同的方式实现相同的功能。

    【讨论】:

      【解决方案2】:

      Class6 确实没有任何名为“print_all”的方法。拥有它的是Class8。因此,您需要一个 Class8* 类型的指针来调用 print_all。

      也许您正在寻找的是 dynamic_cast:

      if (Class8* pointer_to_eight = dynamic_cast<Class8*>(pointer_to_six))
          pointer_to_eight->print_all();
      

      但是,要使其工作,您需要 Class6 至少有一个虚拟方法。

      此外,您必须从 Class8 中删除“object_name”成员,因为它会与 Class6 中的同名成员冲突。

      【讨论】:

      • 关于dynamic_cast的部分是对的,但是:“从Class8中删除“object_name”成员,因为它会发生冲突”不是:它是私有的,所以没有冲突。假设你真的想要两个不同的名字。
      猜你喜欢
      • 2013-06-14
      • 2010-10-01
      • 2017-07-27
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多