C++ 如何使用基类指针调用派生类非虚拟成员函数,而不使用类型转换和多态性?
有没有什么方法可以让ptr->fun2()成为可能C++ 如何使用基类指针调用派生类非虚拟成员函数,而不使用类型转换和多态性?,c++,c++11,C++,C++11,有没有什么方法可以让ptr->fun2()成为可能 class A { void fun1() { A* ptr; ptr->fun2(); } } class B : class A { void fun2() { } } 这是不可能的。C++是一种静态类型语言。ptr的类型是指向A的指针fun
class A
{
void fun1()
{
A* ptr;
ptr->fun2();
}
}
class B : class A
{
void fun2()
{
}
}
这是不可能的。C++是一种静态类型语言。
ptr
的类型是指向A
的指针fun2
不是a
的成员。根据定义,不可能通过类型a
的指针/引用调用fun2
这通常通过铸造来解决。由于未指定的原因,您取消了它的资格,因此无法执行您想要的操作。否。
A
没有成员函数fun2
,因此您不能通过A*
类型的指针调用ptr->fun2()
如果指针恰好指向具有该成员函数的派生对象,则可以静态\u强制转换
指向具有该成员函数的类型的指针。如果您不知道,那么您可以尝试动态\u cast
(但仅当类型为多态时),但这通常是一个糟糕的设计(但有时还行),而不是您想要做的
我只是想知道我的问题是否有解决办法
如果要使用指向a
的指针调用fun2
,则解决方案是向类a
添加成员函数fun2
。如果希望将对ptr->fun2
的调用分派到B::fun2
,则需要将函数设置为虚拟函数-但由于某些原因,您明确不希望使用针对此问题设计的工具
我也不想让fun2()成为虚拟的,因为许多派生的base类中只有一个将实现它
这并不妨碍您在a
中使用虚拟函数,但对于接口来说,只有一个派生类使用虚拟函数可能是不好的
我建议首先不要使用A*
指针,而是使用B*
。这样就不需要强制转换,也不需要调用虚拟函数
t是否ptr指向类型B的对象,然后在fun1()中进行“ptr->fun2()”的类型检查
那么,铸造也许不是一个坏的选择。但我有另一个建议:将fun1
分为两个版本。一个是为调用fun2
的类型B
调用的,另一个是为其他类型调用的。您可以创建一个虚拟的fun2
?@Biffen如果您知道它,您可以静态投射它dynamic_cast
适用于您不知道的情况,或用于复杂的继承层次结构。@Angew是的,当然。我的错。我不想以任何方式抛出基本指针。我也不想让fun2()成为虚拟的,因为许多派生的base类中只有一个将实现它。@Anu这与许多事情相违背。闻起来像是XY问题。你真正想做的是什么?如果你知道对象是正确的目标类型,你甚至可以static\u cast
。更不用说,dynamic\u cast
在类中至少需要一个虚拟函数。我不能将其虚拟化,因为fun2()不适用于其他派生自同一基类的类,基类也不需要实现它。@Anu那么就不要在其他派生类中实现它,我看不出有什么问题…@Anu如果基类不应该知道它的派生类,那么它就不应该调用它的派生类的函数。正如我已经回答的,使用虚拟函数仍然是一种选择。但是,如果没有关于您的问题的任何信息,就不可能说哪个选项最适合您。@Anu“因为基类不应该知道它的派生类”-那么它应该不知道派生类中存在一个名为fun2
的函数,更不用说尝试调用它了。你在自相矛盾。