我已经编写了近二十年的C和C++代码,但这些语言的一个方面我从未真正理解过.我显然使用常规演员表,即
MyClass *m = (MyClass *)ptr;
Run Code Online (Sandbox Code Playgroud)
到处都是,但似乎有两种其他类型的演员,我不知道其中的区别.以下代码行之间有什么区别?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
Run Code Online (Sandbox Code Playgroud) public Object foo(int opt){
if (opt == 0) return new String();
else if (opt == 1) return new Integer(1);
else if (opt == 2) return new Double(1);
else if ...
.. and many more
}
public void doSomething(String s){..}
public void doSomething(Integer i){..}
public void doSomething(Double d){..}
... and many more doSomething method
public static void main(String[] args){
...
Object o = foo(x); //x is a value obtained during runtime, e.g. from user input
//now I want to call doSomething …Run Code Online (Sandbox Code Playgroud) 我在我们的项目中看到一些奇怪的代码,如下所示。我测试它并得到正确的答案。但我认为这是非法的,谁能给我解释一下?
class Member
{
public:
Member():
a(0),b(1)
{}
int a;
int b;
};
// contains `Member` as its first member
class Container
{
public:
Container():
c(0),d(0)
{}
Member getMemb(){return fooObject;}
Member fooObject;
int c;
int d;
};
Run Code Online (Sandbox Code Playgroud)
以及我们如何使用它:
int main()
{
auto ctain = new Container;
auto meb = (Member *)ctain; // here! I think this is illegal
cout << "a is " << meb->a << ", b is" << meb->b << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了正确的答案,a是0,b是1。这只是巧合吗?我还注意到如果fooObject不是第一个成员,我会得到错误的答案。