是否可以通过引用以基类作为参数的函数来传递派生类

Posted

技术标签:

【中文标题】是否可以通过引用以基类作为参数的函数来传递派生类【英文标题】: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(); 【参考方案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 和其他各种符号转换演员时,这很常见。

【讨论】:

以上是关于是否可以通过引用以基类作为参数的函数来传递派生类的主要内容,如果未能解决你的问题,请参考以下文章

C++使用一个基类派生出圆形和矩形,在矩形下派生出正方形并计算所有面积

将派生类传递给基类参数的函数

为啥当我有两个函数时编译器没有显示错误,一个将基类作为参数,一个将派生类作为参数?

unique_ptr 到派生类作为函数的参数,该函数将 unique_ptr 带到基类

将基类转换为派生类[重复]

函数可以接受抽象基类作为参数吗?