标签:
代码:
class A{
public:
virtual void f()
{
cout << "A" << endl;
}
};
class B: public A{
public:
virtual void f()
{
cout << "B" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[]){
A* pa = new A();
pa->f();
B* pb = (B*)pa;
pb->f();
delete pa,pb;
pa = new B();
pa->f(); //多态
pb = (B*)pa;
pb->f();
}
下面语句发生什么变化。
B* pb = (B*)pa;
解析:其实什么变化也没有发生,还是输出A,不存在覆盖问题,pb指向pa原来地址。
答:不能覆盖,派生类重写基类的虚函数,返回值类型也必须相同。
如下代码报错吗?
class A{
public:
A(int a){}
};
class B: public A{
public:
B(){}
};
解释,在基类没有默认构造的情况下,派生类是需要显式调用。所以上面代码编译不通过。
下面程序结果是什么:
class A{public: int m_a;};
class B{public: int m_b;};
class C:public A,public B{public: int m_c;};
int _tmain(int argc, _TCHAR* argv[]){
C* pc = new C;
pc->m_a = 1; pc->m_b = 2; pc->m_c = 3;
B* pb = dynamic_cast<B*>(pc);
A* pa = dynamic_cast<A*>(pc);
B pbb = *pc; //这里会发生什么?
cout << pc << endl;
cout << pb << endl;
cout << pa << endl;
cout << &pbb << "sizeof:" << sizeof(pbb) << "m_b" << pbb.m_b << endl;
if (pc == pb)
cout << "equal" << endl;
else
cout << "not equal" << endl;
if ((int)pc == (int)pa)
cout << "equal" << endl;
else
cout << "not equal" << endl;
}
解析:每个语句解释如下,
1. A* pa = dynamic_cast<A*>(pc);
此时pa指向了子类A的那部分,地址值与pc相同。
2. B pbb = *pc;
这里会发生切割,调用了B类拷贝构造,将B的那部分切割到pbb的所在的栈空间中。
3. if (pc == pb)
这里会发生隐式类型转换,pc = (C*)pb
4. if ((int)pc == (int)pa)
虽然没有隐式类型转换,但地址相同。
下面代码中哪条语句会出现问题。
class A{
public:
virtual void foo(){cout << "A foo()" << endl; }
void pp(){ cout << "A pp()" << endl; }
};
class B:public A{
public:
void foo(){cout << "B foo()" << endl; }
void pp(){ cout << "B pp()" << endl; }
void funB(){ cout << "B::funB()" << endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
A *pa = &a;
(dynamic_cast<B*>(pa))->foo(); //语句1
(dynamic_cast<B*>(pa))->pp(); //语句2
(dynamic_cast<B*>(pa))->funB(); //语句3
system("pause");
return 0;
}
解析:语句1会出现问题。foo()是虚函数,编译器会根据对象的虚函数指针查找虚函数表,定位foo函数。
dynamic_cast不是强制类型转换,而是带有某种“咨询”性质的,如果不能转换,dynamic_cast会返回NULL,表示不成功。
上面3条语句相当于:
B* bnull = NULL;
bnull->foo();
bnull->pp();
bnull->funB();
上面的转换时不成功的,所以返回的是NULL指针,又因为pp和funB函数未使用任何成员数据,也不是虚函数,不需要this指针,也不需要动态绑定,所以可以正常运行。
下面代码输出结果是多少?
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/z702143700/article/details/47840559