C++多态 - 对象转型
测试代码和输出。
多态实现机制不必多说,vptr指向vtbl,一般vptl安插在class object的首部。
当在转型时,有两种情况:
1. 转型指针,Base * pb = static_cast<Base *>(pd);
其实就是新建一个指针指向了同一块内存地址,转型指针只是影响了指针的解释方式,没有影响内存的内容,vptr还是原来的地址。
2. 转型对象(向上转型),Base b = static_cast<Base>(*pd);
对象转型其实是一个复制构造,复制对象的数据属性,但是并不赋值隐藏着的vptr,而是安插新的vptr。
class Base { public: Base(int _val) : val(_val) {} void test() { cout << "test base" << endl; } virtual void test_vir() { cout << "test base virtual" << endl; } void set(int _val) { val = _val; } void print() { cout << "val: " << val << endl; } private: int val; }; class Derived : public Base { public: Derived(int _val) : Base(_val) {} void test() { cout << "test derived" << endl; } virtual void test_vir() { cout << "test derived virtual" << endl; } }; int main () { Derived * pd = new Derived(10); Base * pb = static_cast<Base *>(pd); pb->test(); pb->test_vir(); pb->print(); Base b = static_cast<Base>(*pd); b.test(); b.test_vir(); b.print(); b.set(20); b.print(); pb->print(); cout << &b << endl; cout << &(*pd) << endl; return 0; } output: test base test derived virtual val: 10 test base test base virtual val: 10 val: 20 val: 10 0x68fee8 0xa41600
goudan-er SHARE · CPP
C++