我不明白为什么会出现这种情况:
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。我如何实现我想要的输出?谢谢。
答案 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是实例。