【发布时间】:2015-12-14 05:38:22
【问题描述】:
我读过关于重新解释和动态演员表的文章,但我看到了一些我有疑问的例子。 reinterpret_cast:
#include <iostream>
using namespace std;
class A
{
public:
void a() {
cout << "a";
}
};
class B: private A
{
public:
void a() {
cout << "b";
}
};
int main()
{
A *a = new A();
B *b = reinterpret_cast<B*>(a);
B *b2 = new B();
a = reinterpret_cast<A*>(b2);
b->a();
a->a();
return 0;
}
会打印 ba。 我的解释是 reinterpret_cast 改变了位模式,并且这两种类型都有一个名为 a() 的函数,结果就是这样。 然后我看到了这个:
using namespace std;
class B;
class A
{
private:
int j = 4;
public:
A() {}
A(const B &b) {}
void a() {
cout << j << endl;
}
};
class B
{
private:
int i = 5;
public:
B() {};
B(const A &a) {}
void a() {
cout << i << endl;
}
};
int main()
{
A *a = new A();
B *b = reinterpret_cast<B*>(a);
B *b2 = new B();
a = reinterpret_cast<A*>(b2);
b->a();
a->a();
return 0;
}
然后打印了 45。我猜它有继承的东西,但我不知道如何或为什么。
关于动态转换:
#include <iostream>
using namespace std;
class A {
public:
virtual ~A(){}
};
class B {
public:
void a() {
cout << "B" << endl;
}
virtual ~B() {}
};
int main()
{
A *a = new A();
dynamic_cast<B*>(a)->a();
return 0;
}
这将打印“B”。 但如果我要写:
virtual void a() {
cout << "B" << endl;
}
我会遇到分段错误。 为什么我得到了我在这两个例子中得到的结果?
感谢您的所有帮助!
【问题讨论】:
-
有错误的代码会做你意想不到的事情。为什么你会期望这样的代码“将这个指向 B 的指针并假装它是指向 A 的指针而不应用处理继承所需的任何转换”会做任何明智的事情?为什么你会期望在没有任何可以调用它的对象的情况下调用一个虚函数?做没有意义的事,就会得到没有意义的结果。
标签: c++ c++11 dynamic-cast reinterpret-cast