为什么受保护的继承会导致dynamic_cast失败
Why does protected inheritance cause dynamic_cast to fail?
我将C++基类更改为protected
继承,并且dynamic_cast
停止工作。
为什么要将继承更改为protected
来更改dynamic_cast
的行为?
struct Base {
static Base *lookupDerived(); // Actually returns a Derived * object.
};
struct Derived : protected /* Switch this to public to get it working */ Base {
static void test() {
Base *base = lookupDerived();
if (dynamic_cast<Derived *>(base)) {
std::cout << "It worked (we must be using public inheritance)." << std::endl;
} else {
std::cout << "It failed (we must be using protected inheritance)." << std::endl;
}
};
您作为外部用户无法访问类的受保护成员或私有成员。这同样适用于受保护或私人继承。类的作者不希望外部用户访问受保护的/私有的父类,就像他们希望外部用户可以访问受保护/私有的成员一样。
原因之一:假设父类有一个非虚拟析构函数。从基类指针中删除实例派生类会导致未定义的行为。将父类设为protected/private意味着您不能这样做(请参见脚注)。
另一个原因是:假设有问题的类的作者不希望外部用户访问父类的公共成员。可以使用公共继承(is-a)并将这些公共接口降级为受保护的或私有的,但这将违反Liskov替换原则。受保护或私有继承不是is-a关系。这些公共方法通过受保护或私有继承而成为受保护或私人方法。Liskov替换没有问题,因为受保护/私有继承不是is-a。
脚注:有一种丑陋的方法:使用C样式的强制转换。外部用户可以投射派生类指针指向基类指针,即使基类不可访问。对我来说,这是使用-Wold-style-cast -Werror
编译的另一个原因。
私有(或受保护)继承在语义上与公共继承不同。它不是一种"是-是"关系,而是一种"以某种方式实现"的关系。
这意味着您不能使用基类作为派生对象的句柄。
当您将继承更改为protected时,您的两个类之间的关系将从对象的外部隐藏。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理