使用指向其他 class 的指针访问 class 中的成员函数
Access to member function in class using pointer to other class
我有一个简单的 class,带有私有字段和带有 public 成员函数的构造函数,用于打印来自其他 classes 的所有对象名称。
这是头文件中的代码:
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 扩展了 public classes 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();
但是编译器说class Class6'没有名为'print_all'的成员。我做错了什么?
发生这种情况的原因是指针类型很重要。您的 pointer_to_six
指向 class8 对象,它确实包含 print_all,但它的类型是 class6 *
。因此,它被取消引用为 class6 对象,并且 class6 不包含名为 print_all
.
的成员
有几个解决方案。您可以使用强制转换来转换指针类型。您可以使用 C 风格的不安全转换来表示 ((Class8 *) pointer_to_six)->print_all();
或者您可以使用更安全的 C++ 转换,例如 static_cast
.
您也可以使用虚函数。即每个class实现同一个功能的方式不同
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中的同名成员冲突。
我有一个简单的 class,带有私有字段和带有 public 成员函数的构造函数,用于打印来自其他 classes 的所有对象名称。
这是头文件中的代码:
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 扩展了 public classes 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();
但是编译器说class Class6'没有名为'print_all'的成员。我做错了什么?
发生这种情况的原因是指针类型很重要。您的 pointer_to_six
指向 class8 对象,它确实包含 print_all,但它的类型是 class6 *
。因此,它被取消引用为 class6 对象,并且 class6 不包含名为 print_all
.
有几个解决方案。您可以使用强制转换来转换指针类型。您可以使用 C 风格的不安全转换来表示 ((Class8 *) pointer_to_six)->print_all();
或者您可以使用更安全的 C++ 转换,例如 static_cast
.
您也可以使用虚函数。即每个class实现同一个功能的方式不同
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中的同名成员冲突。