2010-10-13 79 views
1

考虑下面这个简单的多态性...如何在多态中调用子对象的重载函数?

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; 
} 

至于我可以告诉大家,在这两种情况下执行一个将被调用。

如何根据ptr的动态类型调用someFunc的“派生”实现?

在我的真实代码中有很多子类型,所以使用dynamic_cast来检查每个子类是不实际的。

回答

4

尝试:

class Parent 
{ 
    public: 
     virtual someFunc() { /* implementation A */ }; 
     //^^^^^^^ 
}; 

虽然在技术上不是必需的。
我总是觉得它好作风也宣布派生功能虚拟:

class Child : public Parent 
{ 
    public: 
     virtual someFunc() { /* implementation B */ }; 
}; 

与Java功能默认情况下不虚。

3

声明someFunc虚拟。这将确保调用实际对象的实现,而不是依赖于指针类型的实现。

然而,这会增加一些与创建VTABLE和较慢调用虚函数有关的开销,但本质上是多态性。

2

这里没有多态现象!你的功能没有一个是virtual

如果你想多态,这样做:

class Parent { 
public: 
    virtual someFunc() { /* implementation A */ }; 
};