C++ 如何将基类的双指针强制转换为派生类的双指针?
如果我将双指针传递给类或函数,如何将其转换为派生类型的双指针或对派生类型指针的引用,以便访问其成员C++ 如何将基类的双指针强制转换为派生类的双指针?,c++,inheritance,dynamic-cast,double-pointer,C++,Inheritance,Dynamic Cast,Double Pointer,如果我将双指针传递给类或函数,如何将其转换为派生类型的双指针或对派生类型指针的引用,以便访问其成员 class A { }; class B : public A { public: void Method() {}; }; A *a_ptr = new B{}; void Function(A *const *a_ptr_ptr) { B *const &b_ptr_ptr = dynamic_cast<B *const>(*a_ptr_ptr);
class A
{
};
class B : public A
{
public:
void Method() {};
};
A *a_ptr = new B{};
void Function(A *const *a_ptr_ptr)
{
B *const &b_ptr_ptr = dynamic_cast<B *const>(*a_ptr_ptr);
b_ptr_ptr->Method();
};
int main()
{
Function(&a_ptr);
}
A类
{
};
B类:公共A
{
公众:
void方法(){};
};
A*A_ptr=新的B{};
空函数(A*const*A_ptr_ptr)
{
B*常数和B_ptr_ptr=动态投射(*a_ptr_ptr);
b_ptr_ptr->Method();
};
int main()
{
功能(&a_ptr);
}
如果我将双指针传递给一个类或函数,我如何将它转换为派生类型的双指针或对派生类型指针的引用
你不能
这样我就可以访问它的成员了
class A
{
};
class B : public A
{
public:
void Method() {};
};
A *a_ptr = new B{};
void Function(A *const *a_ptr_ptr)
{
B *const &b_ptr_ptr = dynamic_cast<B *const>(*a_ptr_ptr);
b_ptr_ptr->Method();
};
int main()
{
Function(&a_ptr);
}
您不需要指向访问成员的指针。你需要的是一个指针。您可以通过间接指向指针来获得它。事实上,这就是您在示例程序中所尝试的。该程序的问题是,您无法将指针动态转换为非多态类型,例如A
。您可以通过使A
多态或使用static\u cast
-在无法验证传递的指针是否确实指向B
的底部的情况下修复此问题
或者,您可以通过该对象间接转换并转换引用,而不是转换为指向对象的指针。例如:
assert(a_ptr_ptr && *a_ptr_ptr):
B& b = static_cast<B&>(**a_ptr_ptr);
b.Method();
assert(a_ptr_ptr&&*a_ptr_ptr):
B&B=静态铸件(**a\U ptr\U ptr);
b、 方法();
如果我将双指针传递给一个类或函数,我如何将它转换为派生类型的双指针或对派生类型指针的引用
你不能
这样我就可以访问它的成员了
class A
{
};
class B : public A
{
public:
void Method() {};
};
A *a_ptr = new B{};
void Function(A *const *a_ptr_ptr)
{
B *const &b_ptr_ptr = dynamic_cast<B *const>(*a_ptr_ptr);
b_ptr_ptr->Method();
};
int main()
{
Function(&a_ptr);
}
您不需要指向访问成员的指针。你需要的是一个指针。您可以通过间接指向指针来获得它。事实上,这就是您在示例程序中所尝试的。该程序的问题是,您无法将指针动态转换为非多态类型,例如A
。您可以通过使A
多态或使用static\u cast
-在无法验证传递的指针是否确实指向B
的底部的情况下修复此问题
或者,您可以通过该对象间接转换并转换引用,而不是转换为指向对象的指针。例如:
assert(a_ptr_ptr && *a_ptr_ptr):
B& b = static_cast<B&>(**a_ptr_ptr);
b.Method();
assert(a_ptr_ptr&&*a_ptr_ptr):
B&B=静态铸件(**a\U ptr\U ptr);
b、 方法();