为什么 reinterpret_cast 在私有继承中起作用
Why reinterpret_cast does work in private inhertiance
我在阅读有关应用继承时的访问说明符的内容,我知道在 private inheritance
中我们无法使用 pointers/references.[=17 从派生对象转换为基础对象 class =]
但是当我使用 reinterpret_cast
时它起作用了。下面是我的测试代码:
class base {
int _a;
public:
base(int a): _a(a) {}
base(): _a(0) {}
};
class derived : private base
{
public:
derived(int b):base(b) {};
};
int main() {
derived b(25);
base &a = static_cast<base&>(b);//this line will generate a compile error
base &c = reinterpret_cast<base&>(b); //here it works
}
所以我的问题甚至是私有继承,为什么基础 class 会使用 retinterpret_cast
公开?
谢谢!
//EDIT 2
class base {
int _a;
public:
base(int a): _a(a) {}
base(): _a(100) {}
~base() { std::cout << "deleting base" << _a << "\n"; }
};
class derived : private base
{
public:
virtual ~derived() = default;
derived(int b):base(b) {};
};
int main() {
derived b(25);
base &c = reinterpret_cast<base&>(b);
}
//OutPut : Deleting 25
reinterpret_cast
与 static_cast
不同
考虑以下示例:
class A { int a; }
class B { int b; }
class C : public A, B { }
使用 static_cast
将 C 转换为 B 会将指针更改为正确的结果,而 reinterpret_cast
会使指针保持不变,这是不正确的。
是否违反了私有继承?不是真的。
C++ 中的可访问性仅影响在哪些范围内可以使用标识符以有效方式引用某物。该系统旨在防止 Murphy,而不是您使用的马基雅维利诡计。
reinterpret_cast
基本上是你告诉编译器 "forget what you know, trust my judgment instead"。确实如此。你声称这个左值实际上指的是 base
?好吧,随心所欲。但是编译器不会做任何事情来保护你,它假设你知道你在做什么。它很容易折断。有@Dani 的例子,还有这个:
class derived : private base
{
public:
virtual ~derived() = default;
derived(int b):base(b) {};
};
如果您尝试使用 c
并调用使用 _a
的成员函数,您认为会发生什么情况?它会找到什么?
我在阅读有关应用继承时的访问说明符的内容,我知道在 private inheritance
中我们无法使用 pointers/references.[=17 从派生对象转换为基础对象 class =]
但是当我使用 reinterpret_cast
时它起作用了。下面是我的测试代码:
class base {
int _a;
public:
base(int a): _a(a) {}
base(): _a(0) {}
};
class derived : private base
{
public:
derived(int b):base(b) {};
};
int main() {
derived b(25);
base &a = static_cast<base&>(b);//this line will generate a compile error
base &c = reinterpret_cast<base&>(b); //here it works
}
所以我的问题甚至是私有继承,为什么基础 class 会使用 retinterpret_cast
公开?
谢谢!
//EDIT 2
class base {
int _a;
public:
base(int a): _a(a) {}
base(): _a(100) {}
~base() { std::cout << "deleting base" << _a << "\n"; }
};
class derived : private base
{
public:
virtual ~derived() = default;
derived(int b):base(b) {};
};
int main() {
derived b(25);
base &c = reinterpret_cast<base&>(b);
}
//OutPut : Deleting 25
reinterpret_cast
与 static_cast
不同
考虑以下示例:
class A { int a; }
class B { int b; }
class C : public A, B { }
使用 static_cast
将 C 转换为 B 会将指针更改为正确的结果,而 reinterpret_cast
会使指针保持不变,这是不正确的。
是否违反了私有继承?不是真的。
C++ 中的可访问性仅影响在哪些范围内可以使用标识符以有效方式引用某物。该系统旨在防止 Murphy,而不是您使用的马基雅维利诡计。
reinterpret_cast
基本上是你告诉编译器 "forget what you know, trust my judgment instead"。确实如此。你声称这个左值实际上指的是 base
?好吧,随心所欲。但是编译器不会做任何事情来保护你,它假设你知道你在做什么。它很容易折断。有@Dani 的例子,还有这个:
class derived : private base
{
public:
virtual ~derived() = default;
derived(int b):base(b) {};
};
如果您尝试使用 c
并调用使用 _a
的成员函数,您认为会发生什么情况?它会找到什么?