如何将派生类的指针传递给基类的指针?
How to pass pointer of derived class to reference to pointer of base class?
这是示例代码。
class BaseClass {
};
class DerivedClass : public BaseClass {
};
int Foo(BaseClass*& ptr) {
}
DerivedClass* ptr_to_derived;
//following will not work
Foo(ptr_to_derived);
我无法编译上面的代码,错误消息是"can't convert DerivedClass* to BaseClass*&
"。那么我怎样才能ptr_to_derived传递给Foo呢?
错误消息非常明确:
错误:类型的非常量引用初始化无效 '
BaseClass*&
' 来自类型为 'BaseClass*
' 的右值
由于Foo
通过非常量引用获取指针,因此无法向其传递右值。当您将其传递给Foo
时,从DerivedClass
到BaseClass
的隐式转换会让您获得错误所抱怨的右值。
您可以从派生的指针创建一个基指针并传递该指针:
DerivedClass* ptr_to_derived;
BaseClass* ptr_derived_base = ptr_to_derived;
Foo(ptr_derived_base);
问题是Foo
可能会修改传递的指向基的指针。例如:
class OtherDerivedClass : public BaseClass {
};
OtherDerivedClass* ptr_to_other_derived = ...;
void Foo(BaseClass*& ptr)
{
ptr = ptr_to_other_derived;
}
如果你能用ptr_to_derived
来称呼这个Foo
,你认为会发生什么?ptr_to_derived
现在不应该指向一个DerivedClass
,而应该指向一个OtherDerivedClass
的对象吗?这在各个层面上都是错误的。
解决方案 1:不允许Foo
修改指针。任一按值传递:
void Foo(BaseClass* ptr)
或通过 const-ref:
void Foo(const BaseClass*& ptr)
解决方案 2:创建Foo
可以修改的指向基数的指针变量。
BaseClass* ptr_to_base = ptr_to_derived;
foo(ptr_to_base);
这当然不会ptr_to_derived
修改。C++ 不允许你传递临时表达式(这是从DerivedClass*
到BaseClass*
的转换将返回的内容),因为Foo
再次表示它将修改该指针,并且更改的临时表达式将被丢弃。这通常是一个错误。当然,您仍然可以决定不关心Foo
可能做出的ptr_to_base
更改。
你不能那样做。
您可以做的是转换为指向基的指针,将该转换后的指针存储在某个位置(例如变量),并通过左值引用传递它。引用不能引用派生的指针。这样:
BaseClass* ptr_to_base = ptr_to_derived;
Foo(ptr_to_base);
但是,最好按值传递指针以避免这种麻烦。或者最好甚至传递引用而不是指向基的指针,以防足够。这样:
int Foo(BaseClass& ref)
有了这个,您可以调用:
DerivedClass1 d1;
DerivedClass2 d2;
Foo(d1);
Foo(d2);
// or with pointers
DerivedClass1* d1_ptr = &d1;
DerivedClass2* d2_ptr = &d2;
Foo(*d1_ptr);
Foo(*d2_ptr);
这是非法的,有充分的理由,请查看以下代码:
class BaseClass {};
class DerivedClass :public BaseClass {};
class DerivedClass2 :public BaseClass {};
DerivedClass2 derived2;
void Foo(BaseClass*& ptr) {
ptr = &derived2; // Legal.
}
DerivedClass* ptr_to_derived = nullptr;
那么如果合法,Foo(ptr_to_derived)
会ptr_to_derived
不相关的DerivedClass2
这是错误的。
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如果基类包含双指针成员,则派生类的构造函数
- 使用基类指针调用基类的值构造函数的语法是什么?
- 如何在基类指针向量的元素上应用重载的多态函数
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 指向基类派生类的 std::unique_ptr 的指针
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- std::variant vs指向C++中异构容器基类的指针
- 模板化函数或具有指向基类的指针的函数
- 指向基类的唯一指针
- C++函数解析基类指针到派生类指针
- 指向基类的指针的 std::vector 的深层副本
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 无法从指针派生类转换为指针基类(多态性)
- 使用指针基类的=操作符的多态性