自定义强制转换未应用于派生类的引用
Custom cast not applied to references of derived class
在强制转换引用时,编译器似乎试图将Derived
类转换为其Base
,并且根本不使用自定义强制转换。不过,这与指针完美配合。
示例:
#include <iostream>
class Base {
public:
int fn() {
return 42;
}
};
class Derived : private Base {
public:
operator Base&() {
return *dynamic_cast<Base*>(this);
}
operator Base*() {
return dynamic_cast<Base*>(this);
}
};
int main() {
Derived d;
Derived &dRef = d;
std::cout<<static_cast<Base&>(dRef).fn()<<std::endl; // <-- error: non-reachable base >>Base<< of >>Derived<<
std::cout<<static_cast<Base*>(d)->fn()<<std::endl; // OK -> "42"
}
为什么不能像这样使用自定义铸造?是否有可能实现预期行为("向上投射"到具有引用的不可访问的基础)?
[class.conv.fct]/1读取(强调矿):
转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),到该类型的(可能是cv限定的)基类(或对的引用it),或作废(可能是cv合格)。
叮当确实发出了警告:
warning: conversion function converting 'Derived' to its base class 'Base' will never be used
operator Base&() {
^
指针没有这样的限制,所以static_cast<Base*>(d)
可以工作并调用自定义转换运算符。
如果你真的想使用转换运算符作为引用,你必须明确地调用它:
std::cout << dRef.operator Base&().fn() << std::endl;
但在这种情况下,您可能只想为此创建一个常规成员函数,或者诚实地公开继承。
相关文章:
- 如何使用基类指针引用派生类成员
- 如何引用基类的派生类?
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 如何复制只引用基类的派生类
- 从 Base 引用对象调用派生类的成员
- C++ 为什么要将对基类的引用传递给派生类的构造函数
- 通过基类引用派生类后打印的错误值
- 如何在 c++ 中通过基类引用访问派生类的对象?
- 从基类的共享指针向下转换到派生类的引用
- 基类需要引用尚未构造的派生类成员
- 通过基类指针获取派生类对象的引用
- 为什么不能在实例化对基类的引用的同时实例化指向派生类的指针?
- 如何在模板成员中引用派生类?
- C++通过 const 引用传递时不调用派生类函数
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 是否可以在引用另一个派生类的派生类中声明复制构造函数?
- 如何从派生类访问引用成员变量?
- 无法通过引用 std::exception 来捕获从 std::exception 派生的类
- 从派生引用到基引用的static_cast编译器错误
- C++是否保证基引用和派生引用的地址相等