C++ 如何使用基类指针调用派生类非虚拟成员函数,而不使用类型转换和多态性?

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

有没有什么方法可以让ptr->fun2()成为可能

 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
的函数,更不用说尝试调用它了。你在自相矛盾。