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

How can I call derived class non virtual member function using base class pointer without typecasting and using polymorphism?

本文关键字:类型转换 多态性 函数 指针 基类 何使用 调用 派生 虚拟成员      更新时间:2023-10-16

有什么可能的方法可以让ptr->fun2((成为可能吗?

 class A
    {
        void fun1()
        {
             A* ptr;
             ptr->fun2();
         }
    }
    class B : class A
    {
        void fun2()
        {
        }
    }

这是不可能的。C++是一种静态类型语言。ptr的类型是指向A的指针。 fun2不是A的成员。根据定义,不可能通过指向类型 A 的指针/引用来调用fun2

这通常通过铸造来解决。由于您因未指定的原因取消了资格,因此无法做您想做的事。

No. A 没有成员函数fun2,因此您不能通过 A* 类型的指针调用ptr->fun2()

如果指针恰好指向具有此类成员函数的派生对象,则可以static_cast指向具有成员函数的类型的指针。如果你不知道,那么你可以尝试dynamic_cast(但前提是类型是多态的(,但这通常是一个糟糕的设计(但有时还可以(,而不是你想做的。

只想知道我的问题是否有任何解决方案

如果要用指向A的指针调用fun2,那么解决方案是将成员函数fun2添加到类A中。如果您希望将调用ptr->fun2调度到 B::fun2 ,那么您需要使函数成为虚拟函数 - 但由于某种原因,您明确不想使用为此问题设计的工具。

我也不想使fun2((虚拟,因为许多派生的base类中只有一个会实现它。

这并不妨碍你在A中拥有一个虚函数,但对于接口来说,拥有一个仅由一个派生类使用的虚函数可能是不好的。

我的建议是不要使用指针A*而是首先使用B*。然后你不需要转换,也不需要调用虚函数。

t 发生类型检查是否 ptr 指向类型 B 的对象,然后在 fun1(( 中进行"ptr->fun2((">

那么选角可能不是一个糟糕的选择。但我还有另一个建议:将fun1分成两个版本。一个用于调用 fun2 的类型B,另一个用于其他类型的类型。