如何在多态性中称呼儿童对象的过载功能?
-
30-09-2019 - |
题
考虑以下简单的多态性...
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。
如何根据PTR的动态类型来称呼某些FUNC的“最派生”实现?
在我的真实代码中,有很多孩子类型,因此使用Dynamic_cast检查每个儿童课程是不切实际的。
解决方案
尝试:
class Parent
{
public:
virtual someFunc() { /* implementation A */ };
//^^^^^^^
};
虽然从技术上不需要。
我总是认为还可以声明派生函数虚拟的样式:
class Child : public Parent
{
public:
virtual someFunc() { /* implementation B */ };
};
与Java函数不同,默认情况下不是虚拟的。
其他提示
宣布 someFunc
虚拟的。这将确保调用实际对象的实现,而不是根据指针类型的实现。
但是,这将增加与虚拟函数的VTable且较慢的呼唤相关的一定开销,但实际上是多态性的。
这里没有多态性!您的功能都没有 virtual
.
如果您想要多态性,请执行此操作:
class Parent {
public:
virtual someFunc() { /* implementation A */ };
};
不隶属于 StackOverflow