【问题标题】:Is it possible to pass derived classes by reference to a function taking base class as a parameter是否可以通过引用以基类作为参数的函数来传递派生类
【发布时间】:2012-03-06 08:05:06
【问题描述】:

假设我们有一个带有纯虚方法(接口)的抽象基类IBase

然后我们从基类派生CFooCFoo2

我们有一个知道如何使用 IBase 的函数。

Foo(IBase *input);

这些情况下通常的情况是这样的:

IBase *ptr = static_cast<IBase*>(new CFoo("abc"));
Foo(ptr);
delete ptr;

但是指针管理最好避免,那么有没有办法在这种情况下使用引用?

CFoo inst("abc");
Foo(inst);

Foo 在哪里:

Foo(IBase &input);

【问题讨论】:

  • 是的,您的问题是理想的。
  • 是的;多态性适用于指针和引用。请停止施法。我们不在好莱坞。
  • 现在我知道为什么它被称为铸造......认真!
  • @KerrekSB 好吧,如果你尝试过IBase&amp; b = CFoo();

标签: c++ interface


【解决方案1】:

是的。 您不必向上转换您的对象。必要时,所有派生类型的引用/指针都会隐式转换为基对象引用/指针。

所以:

IBase* ptr = new CFoo("abc"); // good
CFoo* ptr2 = static_cast<CFoo*>(ptr); // good
CFoo* ptr3 = ptr; // compile error

CFoo instance("abc");
IBase& ref = instance; // good
CFoo& ref2 = static_cast<CFoo&>(ref); // good
CFoo& ref3 = ref; // compile error

如果您的类型是多态的,您可能需要考虑使用dynamic_cast

【讨论】:

  • 我找到了问题所在。我使用的是Foo(CFoo("abc"));,它没有编译。
  • @Coder :如果您不知道,出现问题的原因是因为您传递 Foo 一个右值,并且右值不能绑定到非 const 左值引用(即,如果FooFoo(IBase const&amp; input);,它会编译)。
【解决方案2】:

您可以像转换指针一样转换对象。我记得在过去将char 转换为unsigned char 和其他各种符号转换演员时,这很常见。

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多