为什么不在函数中解除引用多态指针调用派生类型参数?

时间:2014-01-07 11:44:33

标签: c++

我不明白为什么会出现这种情况:

class Base
{
public:
    virtual void enablePolymorphism();
};

class Derived : public Base
{
public:
    void enablePolymorphism();
};

class Derived2 : public Base
{
public:
    void enablePolymorphism();
};

void callMe(Base base)
{
     printf("base");
}

void callMe(Derived derived)
{
     printf("derived");
}

void callMe(Derived2 derived2)
{
     printf("derived2");
}

int main()
{
    Base* pointer = new Derived();
    Base* pointer2 = new Derived2();
    callMe(*pointer);
    callMe(*pointer2);
    return 0;
}

这就是我真正想要我的代码所做的事情,我希望方法callMe()能够在类之外,因此我不能使用虚函数,我想在运行时为程序调用callMe(派生派生)当我执行callMe(* pointer2)时,我会调用Me(*指针)和callMe(Derived2 derived2),其输出将被派生2但这不会发生什么,在编译时指针和指针2在被解除引用时被假定为Base类所以调用callMe(Base base)而输出是basebase。我如何实现我想要的输出?谢谢。

3 个答案:

答案 0 :(得分:4)

void callMe(A);
void callMe(B);

A*ptr;
callMe(*ptr);  // guess which of the above is called?

这与多态无关,但是重载分辨率很简单。

答案 1 :(得分:2)

运行时多态性仅适用于使用virtual关键字标记的成员函数(或覆盖virtual成员函数):

virtual void callMe();

对于非成员函数或非虚函数成员函数,在编译时根据参数的声明类型(而不是运行时类型)选择适当的重载。

答案 2 :(得分:2)

编译器唯一看到的是表达式*pointer的类型为Base&,因此可以成功为函数选择正确的重载callMe(Base)

在您的情况下,您可以改为使用多态函数:

#include <memory>
#include <iostream>

class Base {
public:
    virtual void callMe() { std::cout << "called base"; }
};

class Derived : public Base {
public:
    virtual void callMe() { std::cout << "called derived"; }
};

int main() {
    std::unique_ptr<Base> pointer(new Derived());
    pointer->callMe();
    return 0;
}

here是实例。