考虑以下简单的多态...
class Parent {
public:
someFunc() { /* implementation A */ };
};
class Child : public Parent {
public:
someFunc() { /* implementation B */ };
};
int main ()
{
Parent* ptr;
ptr = new Parent();
ptr->someFunc();
delete ptr;
ptr = new Child();
ptr->someFunc();
delete ptr;
return 0;
}
据我所知,在这两种情况下都会调用实现A.
如何调用someFunc的“派生最多”实现,具体取决于ptr的动态类型?
在我的真实代码中有许多子类型,因此使用dynamic_cast检查每个子类是不切实际的。
答案 0 :(得分:4)
尝试:
class Parent
{
public:
virtual someFunc() { /* implementation A */ };
//^^^^^^^
};
虽然技术上不需要。
我总是觉得很好的风格也可以声明派生函数virtual:
class Child : public Parent
{
public:
virtual someFunc() { /* implementation B */ };
};
与Java函数不同,默认情况下不是虚函数。
答案 1 :(得分:3)
声明someFunc
虚拟。这将确保调用实际对象的实现,而不是实现,具体取决于指针类型。
答案 2 :(得分:2)
这里没有多态性!您的所有功能都不是virtual
。
如果您想要多态,请执行以下操作:
class Parent {
public:
virtual someFunc() { /* implementation A */ };
};