如何在没有类型转换和使用多态的情况下使用基类指针调用派生类非虚拟成员函数?

时间:2016-02-09 15:52:51

标签: c++ c++11

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

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

    class B : class A
    {
        void fun2()
        {
        }
    }

2 个答案:

答案 0 :(得分:5)

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

这通常通过铸造来解决。由于您因未指明原因而取消资格,因此无法按照您的意愿行事。

答案 1 :(得分:2)

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

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

  

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

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

  

我不想将fun2()虚拟化,因为只有很多派生类中的一个会实现它。

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

我建议不要使用A*指针,而应首先使用B*。那么你不需要强制转换,也不需要调用虚函数。

  

是否发生了类型检查,ptr是否指向B类对象,然后在fun1()中创建“ptr-> fun2()”

然后施放可能不是一个糟糕的选择。但我有另一个建议:将fun1分成两个版本。调用B类型的一个调用fun2,其中一个类型调用。