2013-05-18 28 views
5

我有许多继承派生类的基类。像这样:
多态性&默认值:可以共存吗?

class A { 
public: 
    virtual void f(string foo = "bar") { 
     cout << foo << endl; 
    } 
}; 

class B: public A { 
public: 
    void f(string foo = "howdy") { 
     cout << foo << endl; 
    } 
}; 

class C: public A { 
public: 
    void f(string foo = "something") { 
     cout << foo << endl; 
    } 
}; 

为了简洁,我只继承了两个类。
这是主要的:

A* aArray[] = { 
    new B, 
    new C, 
}; 

int main() { 
    aArray[0]->f(); 
    aArray[0]->f(); 

    return 0; 
} 

当我运行程序时,我得到的回复是输出:

bar 
bar 

随便怎么样,如果编译器会忽略的重载函数的默认参数。
这是正常的,还是有一些我做错了或我错过了?

+1

默认参数可能会使功能签名不同。最大限度地提高警告并重新编译。 –

+0

@ThomasMatthews:那么解决方案可能是什么?可以在基类虚拟函数中删除默认参数并将它们留在继承的重写函数中吗? – Overflowh

+0

@Overflowh:尝试实验:删除函数签名中的默认分配并重新测试。 –

回答

8

默认值是静态绑定的。换句话说,他们没有多态性行为。这就是为什么你看到

bar 
bar 

而不是派生类的虚拟函数中的那些默认值。

根据有效的C +:

如果默认参数值被动态绑定,编译器将必须想出一个办法,以确定在运行时的虚拟功能的参数的适当的默认值,这将是慢并且比编制过程中确定它们的当前机制更复杂。

相关问题