c – 对于重载函数,为父实例和子实例调用专用版本

c – 对于重载函数,为父实例和子实例调用专用版本,第1张

概述我之前问了一个 question,但事实证明我的问题没有通过我的例子正确建模.所以这是我的实际问题: >我有A级,B级继承自A, >我有两个函数foo(A&)和foo(B&), >我有一个A *指针列表,包含A和B的实例. >对于B的实例,如何为A和foo(B&)的实例调用foo(A&)?约束:我可以修改A和B实现,但不能修改foo的实现. 见下面的例子: #include <iostream> 我之前问了一个 question,但事实证明我的问题没有通过我的例子正确建模.所以这是我的实际问题:

>我有A级,B级继承自A,
>我有两个函数foo(A&)和foo(B&),
>我有一个A *指针列表,包含A和B的实例.
>对于B的实例,如何为A和foo(B&)的实例调用foo(A&)?约束:我可以修改A和B实现,但不能修改foo的实现.

见下面的例子:

#include <iostream>#include <List>class A {public:};class B : public A {public:};voID bar(A &a) { std::cout << "This is an A" << std::endl; }voID bar(B &b) { std::cout << "This is a B" << std::endl; }int main(int argc,char **argv) {  std::List<A *> l;  l.push_back(new B());  l.push_back(new B());  for (std::List<A *>::iterator it = l.begin(); it != l.end(); ++it)    bar(**it);}

虽然我使用带指针的容器,但是使用父类的对象调用bar,而不是子类:

# ./a.outThis is an AThis is an A#

我在期待

This is a B

将指针传递给bar(通过重写其签名)并没有帮助.

感谢安东尼奥帮助澄清这个问题.

解决方法 由于在编译时解决了重载问题,因此需要为编译器提供足够的信息来确定要调用的bar的正确重载.由于您希望根据对象的运行时类型动态做出决策,因此虚函数将有很大帮助:
struct A {    virtual voID bar() { bar(*this); }};struct B : public A {    virtual voID bar() { bar(*this); }};

它可能看起来像是相同的,所以B :: bar可以被消除,但事实并非如此:虽然实体看起来完全一样,但由于C中过载的静态解析,它们会调用不同的条形:

>在A :: bar内部*的类型是A&,因此调用第一个重载.
>在B :: bar内部*的类型是B&,因此调用第二个重载.

修改调用代码栏的调用代码将完成更改:

std::List<A *> l;l.push_back(new B());l.push_back(new B());for (std::List<A *>::iterator it = l.begin(); it != l.end(); ++it)    (*it)->bar();
总结

以上是内存溢出为你收集整理的c – 对于重载函数,为父实例和子实例调用专用版本全部内容,希望文章能够帮你解决c – 对于重载函数,为父实例和子实例调用专用版本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235151.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存