Wil*_*mKF 5 c++ dynamic-cast protected public
我将我的 C++ 基类更改为protected继承,并且我的dynamic_cast(s) 停止工作。
为什么要改变继承来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;
}
};
Run Code Online (Sandbox Code Playgroud)
您作为外部用户无法访问类的受保护或私有成员。这同样适用于受保护或私有继承。类的作者不希望外部用户访问受保护/私有父类,就像他们希望外部用户访问受保护/私有成员一样。
原因之一:假设父类有一个非虚析构函数。从基类指针的实例派生类中删除将导致未定义的行为。使父类受保护/私有意味着你不能这样做(见脚注)。
另一个原因:假设相关类的作者不希望外部用户访问父类的公共成员。可以使用公共继承(is-a)并将这些公共接口降级为受保护或私有,但这会违反 Liskov 替换原则。受保护或私有继承不是is-a关系。这些公共方法通过受保护或私有继承变为受保护或私有。Liskov 替换没有问题,因为 protected/private 继承不是is-a。
脚注:有一个丑陋的方法来解决这个问题:使用 C 风格的强制转换。外部用户可以将派生类指针转换为基类指针,即使基类不可访问。对我来说,这是使用-Wold-style-cast -Werror.