c++关于沿袭的一道题
c++关于继承的一道题
请写出打印结果,并解释一下原因。菜鸟求解。
------解决方案--------------------
------解决方案--------------------
TestB* pB = new TestB();
pB->init();
pB->increment();
pB->print();
-- 上面三个调用的是B的函数,用的是B的mCount
TestA* pA = (TestA*)pB;
pA->init();
pA->increment();
pA->print();
-- 上面三个调用的是B的函数,用的是B的mCount
TestA aA = *pB;
aA.init();
aA.increment();
#include <stdio.h>
class TestA
{
public:
TestA():mCount(0){}
virtual ~TestA() { printf("Release A\n"); }
public:
virtual void init() { mCount = 5 / 10; }
virtual void increment() { mCount++; }
virtual void print() { printf("This is A, count = %d\n", mCount); }
private:
int mCount;
};
class TestB: public TestA
{
public:
TestB():mCount(0){}
virtual ~TestB() { printf("Release B\n"); }
public:
virtual void init() { mCount = 10; }
virtual void print() { printf("This is B, count = %d\n", mCount); }
private:
int mCount;
};
int main()
{
TestB* pB = new TestB();
pB->init();
pB->increment();
pB->print();
TestA* pA = (TestA*)pB;
pA->init();
pA->increment();
pA->print();
TestA aA = *pB;
aA.init();
aA.increment();
aA.print();
delete pB;
return 0;
}
请写出打印结果,并解释一下原因。菜鸟求解。
c++
继承
------解决方案--------------------
#include <stdio.h>
class TestA
{
public:
TestA():mCount(0){}
virtual ~TestA() { printf("Release A\n"); }
public:
virtual void init() { mCount = 5 / 10; }
virtual void increment() { mCount++; }
virtual void print() { printf("This is A, count = %d\n", mCount); }
private:
int mCount;
};
class TestB: public TestA
{
public:
TestB():mCount(0){}
virtual ~TestB() { printf("Release B\n"); }
public:
virtual void init() { mCount = 10; }
virtual void print() { printf("This is B, count = %d\n", mCount); }
private:
int mCount;
};
int main()
{
TestB* pB = new TestB();
pB->init(); // mCount = 10;
pB->increment(); // 重点在这里,TestB中并没重写虚函数increment ,调用了TestA中
// 函数,并且使TestA::mCount数据成员自增+1, 然后再调用TestB中的打印函数
// TestB::mCount 为10,并不是11, 这里要分清楚是哪一个数据成员
pB->print();
TestA* pA = (TestA*)pB; // 这里涉及到多态,当用基类的指针指向派生类对象时,派生类中有虚函数,则会有一个虚指针,在分配的TestB内存块的最开头的前四个字节,指向TestB中存在的虚函数首地址,
可以在内存中用看pB的值,然后看内存,前四个字节为虚指针,所以pA指向了pB的虚指针所在内存块的地址,
pA->init();
pA->increment();
pA->print(); //因此此处和上面情况类似
TestA aA = *pB;//此处将*pB中已经对TeseA中的数据成员初始化了,并且将该值给了aA中的数据成员
aA.init(); mCount在函数调用前为0,调用后仍为0
aA.increment();mCount = 1;
aA.print();
delete pB; // pB为派生类对象指针,且TestA和TestB的析构均为虚析构,
会先调用B的析构,然后A的析构, 最后应用程序结束时,调用aA的析构函数
即Release B ReleaseA ReleaseA
return 0;
}
------解决方案--------------------
TestB* pB = new TestB();
pB->init();
pB->increment();
pB->print();
-- 上面三个调用的是B的函数,用的是B的mCount
TestA* pA = (TestA*)pB;
pA->init();
pA->increment();
pA->print();
-- 上面三个调用的是B的函数,用的是B的mCount
TestA aA = *pB;
aA.init();
aA.increment();