这段代码如果报错,将在哪里报错如果编译通过,会产生啥行为

1 可以编译通过2 执行B.act-----关键在于 *a = C() 这一步在类B的对象上执行了 类A的赋值操作符,没有修改a和b本身的值a和b 始终指向类B的对象。
■网友
无论b指向的内容如何,b->act都是调用B类的act函数。
■网友
public void 是什么 do是关键字 do while 不能作为函数名我知道你准备问继承但麻烦你先把代码整理清楚
■网友
如果题主这样写,在vs下这一行 *a = C(); 会被优化掉的因为这三个类全是空类,*a = C(); 是没意义的操作如果改成这样,结果有趣多了class A {public:\tA() :m_nNum(0)\t{\t\t\t}\tA(int num) :m_nNum(num)\t{\t}protected:\tint m_nNum;};class B : public A {public:\tB() :A(1){}\tvoid act() { printf("m_nNum:%d", m_nNum); }};class C : public A { };*a=C(); 这时会进行一次对象的赋值操作,默认是直接拷贝这段代码如果报错,将在哪里报错如果编译通过,会产生啥行为

而且这里拷贝的对象类型是父类的类型,也就是类A,如果我们给类A和类C都实现一个operator=成员函数,这里调用的是类的A的operator= 【这段代码如果报错,将在哪里报错如果编译通过,会产生啥行为】 这段代码如果报错,将在哪里报错如果编译通过,会产生啥行为

而a对象指向的实际是b对象的父类处,所以这一步操作实际是对b对象的父类进行一次赋值操作然后调用 b-\u0026gt;act(); 输出的结果就是 m_nNum:0


    推荐阅读