例子问题
例子问题1:调试
阶级基础{};
派生类:公共基{
公众:
无效方法(){cout<< "method1\n";}
};
class Derived2: public Base{
公众:
无效方法(){cout<< "method2\n";}
};
int main () {
Base* bp = new Derived();
导数为d2* d2p = bp;
D2p ->方法();
}
用c++编译和运行程序的结果是什么?
程序编译并运行,打印“method2”
程序编译并运行到不打印任何东西
程序编译并在运行时崩溃。
程序不能编译。
程序编译并运行,打印“method1”
程序不能编译。
在这个问题中,Derived1和Derived2是基类的子类。如果我们看一下这一行:
Base* bp = new Derived();
我们将一个新的派生类赋值给基指针。这将被编译。将Base看作一个较大的对象,因为它是父对象,因此将较小的对象复制到较大的对象中是可以接受的。
现在让我们来看看这个:
导数为d2* d2p = bp;
这一行将导致程序无法编译。由于基类被认为是“更大”的对象,将一个更大的对象复制到一个“更小”的对象将导致无法复制所有内容,这被称为切片的问题.
我们甚至不需要看下一行,因为我们知道程序将崩溃。
例子问题1:调试
考虑到:
Const int = 10;
下列哪个将被编译?
Int * p = &x
常量int * r = &x
Int * const q = &x
以上所有
以上都不是
常量int * r = &x
首先我们看一下给定的语句:
Const int = 10;
“int”前面的const意味着x将始终保持10的值,并且它不会改变。
让我们观察所有的选项。
Int *p =&x
这一行表示将x的地址(在内存中)分配给指针p。然而,这将无法编译,因为int * p没有被标记为const。X被标记为const,所以这迫使int * p也是一个const。
Int * const q = &x
本例中有一个const,但它在错误的位置
常量int * r = &x
const在正确的位置,这是正确的答案
例子问题2:调试
阶级基础{
保护:
无效的方法();
};
派生类:公共基{
};
int main () {
基地b;
b.method ();/ /行
派生d;
d.method ();/ /直线B
}
下面哪个选项是正确的?
这些都不是
行A将编译
行B将不会编译
行A不会编译
行B将编译
行A不会编译
行B将不会编译
行A将编译
行B将编译
行A不会编译
行B将不会编译
要理解这个问题,我们必须理解受保护方法的含义。受保护的方法是一种方法,它可以被自己类中的方法以及它的子类所访问。方法中调用受保护的方法子类.
我们可以看到,method()在main内部被调用。这应该已经引起了警惕。受保护类在子类外部被调用,因此它不会被编译。即使它被称为在在Base和Derived对象中,调用不在Base和Derived类中进行,因此这两行都不会编译。